Création d'objets typés avec Go Generics
Dans Go 1.18, les génériques offrent des moyens puissants de manipuler les types de manière dynamique. Une tâche courante consiste à créer de nouveaux objets d'un type spécifié. Prenons l'exemple suivant :
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" }
FruitFactory tente de créer une nouvelle instance d'un type générique T. Cependant, renvoyer nil fait planter le programme. Explorons comment créer de nouveaux objets dans ce scénario :
Création d'objets non pointeurs
Si le type T n'est pas un type pointeur, vous pouvez créer une variable et renvoyer son adresse :
func (f FruitFactory[T]) Create() *T { var a T return &a }
Vous pouvez également utiliser new(T):
func (f FruitFactory[T]) Create() *T { return new(T) }
Création d'objets pointeur
La création d'objets pointeur nécessite plus de travail. Vous pouvez utiliser l'inférence de type pour déclarer une variable non-pointeur et la convertir en pointeur :
// Constraining a type to its pointer type type Ptr[T any] interface { *T } // The first type param 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) } type Apple struct { color string } func main() { // Instantiating with pointer type appleFactory := FruitFactory[*Apple, Apple]{} apple := appleFactory.Create() // All good apple.color = "red" fmt.Println(apple) // &{red} }
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!