Maison > développement back-end > Golang > Pourquoi ne puis-je pas attribuer des types génériques Go avec des arguments différents ?

Pourquoi ne puis-je pas attribuer des types génériques Go avec des arguments différents ?

Susan Sarandon
Libérer: 2024-12-20 05:56:10
original
125 Les gens l'ont consulté

Why Can't I Assign Go Generic Types with Different Arguments?

Attribution de types génériques avec différents arguments

Dans Go, les interfaces et implémentations génériques ne permettent pas l'affectation directe entre différents arguments de type.

Considérons un exemple simplifié :

// Abstract
type Generic interface {
    ID() string
}

type Props[G Generic] struct{}

// Example
type Example struct {
    id string
}

func (example Example) ID() string {
    return example.id
}

var ExampleProps = Props[Example]{}

// Problem
func Problem() Props[Generic] {
    return ExampleProps
}
Copier après la connexion

Ce code génère une erreur de compilation indiquant que Props[Exemple] ne peut pas être affecté à Props[Generic] dans l'instruction return. En effet, lors de l'instanciation de types génériques avec différents arguments de type, Go crée des types nommés distincts.

Considérez la fonction suivante :

func Problem() Props[Generic] {
    return ExampleProps
}
Copier après la connexion

Elle instancie Props avec Generic comme argument de type. Par conséquent, Props[Example] et Props[Generic] deviennent deux types différents, même si Exemple implémente Generic. Par conséquent, l'attribution de Props[Example] à Props[Generic] n'est pas valide, quels que soient leurs paramètres de type.

Pour résoudre ce problème, une option consiste à instancier Props avec un paramètre de type qui satisfait la contrainte Generic :

// adding a field to make this a bit less contrived
type Props[G Generic] struct{ Value G }

// Props instantiated with T, adequately constrained
func Problem[T Generic](v T) Props[T] {
    return Props[T]{ Value: v }
}

func main() {
    a := Problem(Example{})
    fmt.Println(a)
}
Copier après la connexion

Dans cet exemple, Props est instancié avec un paramètre de type T conforme à l'interface générique. Cela permet d'attribuer des valeurs de type Props[Example] à Props[Generic] et garantit la sécurité du type.

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