Maison >développement back-end >Golang >Pourquoi les interfaces avec des contraintes de type sont-elles interdites dans Go ?

Pourquoi les interfaces avec des contraintes de type sont-elles interdites dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-07 04:12:031023parcourir

Why Are Interfaces with Type Constraints Forbidden in Go?

Contraintes de type d'interface : comprendre et éviter les erreurs de « contraintes de type »

Dans Go, les interfaces sont des constructions puissantes qui définissent un ensemble de méthodes qui un type doit implémenter. Cependant, toutes les interfaces ne sont pas égales. Les interfaces qui contiennent des contraintes de type imposent des limitations supplémentaires sur leur utilisation.

Considérez la définition de type suivante :

type Number interface {
    int | int64 | float64
}

Cette interface définit un type Number qui peut représenter soit int, int64 ou float64. Cependant, les spécifications du langage Go interdisent explicitement d'utiliser de telles interfaces avec des éléments de type dans tout contexte autre que comme contraintes de paramètres de type.

Le compilateur générera l'erreur "l'interface contient des contraintes de type" lorsque vous tenterez d'utiliser une interface avec tapez des éléments dans d’autres scénarios. Par exemple, l'extrait de code suivant ne pourra pas être compilé :

type NumberSlice []Number // interface contains type constraints

func main() {
    a := []Number{Number(1), Number(2), Number(3), Number(4)} // cannot use interface Number in conversion
}

Cette erreur est due au fait que Number est une interface avec des contraintes de type et ne peut donc pas être utilisée comme type d'élément d'une tranche.

Semblables aux interfaces avec des éléments de type, les interfaces qui intègrent des interfaces comparables ou d'autres interfaces non basiques sont également non basiques. Pour éviter ces erreurs, assurez-vous que vos interfaces contiennent uniquement des méthodes ou intègrent des interfaces de base.

Exemples d'interfaces de base et non basiques :

  • Basique : Uniquement les méthodes

    type A1 interface {
      GetName() string
    }
  • Basique : Méthodes et interface de base intégrée

    type B1 interface {
      A1
      SetValue(v int)
    }
  • Non basique : Intégration comparable

    type Message interface {
      comparable
      Content() string
    }
  • Non basique : possède un élément de type (union)

    type Number interface {
      int | int64 | float64
    }
  • Non basique : intègre une interface non basique

    type SpecialNumber interface {
      Number
      IsSpecial() bool
    }

Utilisation correcte des interfaces avec des contraintes de type

Les interfaces avec des contraintes de type ne peuvent être utilisées que comme contraintes de paramètres de type. Par exemple :

type Coordinates[T Number] struct {
    x, y T
}

func sum[T Number](a, b T) T {
    return a + b
}

Dans ce scénario, les interfaces sont utilisées pour restreindre les types autorisés pour les types et fonctions génériques.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn