Les génériques dans Go 1.18 bêta offrent un moyen puissant de créer du code flexible et réutilisable. Une tâche courante consiste à créer de nouveaux objets d'un type spécifique. Cependant, l'implémentation de cette fonctionnalité nécessite une certaine compréhension de la syntaxe des génériques.
Le code ci-dessous définit une FruitFactory avec un paramètre de type générique T. La méthode Create tente de créer une nouvelle instance de T (par exemple, *Apple), mais elle renvoie actuellement zéro, provoquant le blocage du programme lors de l'accès à l'objet. propriétés.
type FruitFactory[T any] struct{} func (f FruitFactory[T]) Create() *T { // How to create a non-nil fruit here? return nil } type Apple struct { color string } func example() { appleFactory := FruitFactory[Apple]{} apple := appleFactory.Create() // Panics because nil pointer access apple.color = "red" }
Étant donné qu'Apple est un type sans pointeur, nous pouvons simplement déclarer une variable de type T et renvoyer son adresse :
func (f FruitFactory[T]) Create() *T { var a T return &a }
Alternativement, new(T) peut être utilisé pour créer une nouvelle instance et renvoyer son pointeur :
func (f FruitFactory[T]) Create() *T { return new(T) }
Avec ces modifications, la méthode Create renvoie désormais un objet valide de type T, résolvant le problème du pointeur nul.
If FruitFactory est instancié avec un type pointeur, une solution plus complexe est nécessaire pour éviter les erreurs de segmentation. Une interface personnalisée, Ptr, est nécessaire pour contraindre les types de pointeurs dans le paramètre type :
// Constraining a type to its pointer type type Ptr[T any] interface { *T } // The first type parameter will match pointer types and infer U type FruitFactory[T Ptr[U], U any] struct{} func (f FruitFactory[T,U]) Create() T { // Declare var of non-pointer type. This is not nil! var a U // Address it and convert to pointer type (still not nil) return T(&a) }
Avec cette configuration, il devient possible de créer de nouvelles instances de types de pointeurs au sein de l'usine générique, évitant ainsi les erreurs de segmentation.
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!