Maison > développement back-end > Golang > le corps du texte

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

Patricia Arquette
Libérer: 2024-11-07 04:12:03
original
996 Les gens l'ont consulté

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
}
Copier après la connexion

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
}
Copier après la connexion

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
    }
    Copier après la connexion
  • Basique : Méthodes et interface de base intégrée

    type B1 interface {
      A1
      SetValue(v int)
    }
    Copier après la connexion
  • Non basique : Intégration comparable

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

    type Number interface {
      int | int64 | float64
    }
    Copier après la connexion
  • Non basique : intègre une interface non basique

    type SpecialNumber interface {
      Number
      IsSpecial() bool
    }
    Copier après la connexion

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
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal