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
Susan Sarandonoriginal
2024-12-20 05:56:10125parcourir

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
}

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
}

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)
}

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!

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