Maison >développement back-end >Golang >Comment créer de nouveaux objets d'un type spécifique à l'aide de génériques dans Go 1.18 ?

Comment créer de nouveaux objets d'un type spécifique à l'aide de génériques dans Go 1.18 ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-12 17:03:09299parcourir

How to Create New Objects of a Specific Type Using Generics in Go 1.18?

Création de nouveaux objets avec des génériques dans Go 1.18

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.

Problème : Création d'objets via 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"
}

Solution : initialiser et renvoyer une variable

É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.

Gestion des types de pointeurs

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!

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