Maison > développement back-end > Golang > Comment puis-je créer en toute sécurité des objets typés d'un type générique dans Go à l'aide de génériques ?

Comment puis-je créer en toute sécurité des objets typés d'un type générique dans Go à l'aide de génériques ?

Barbara Streisand
Libérer: 2024-12-08 06:55:10
original
817 Les gens l'ont consulté

How Can I Safely Create Typed Objects of a Generic Type in Go Using Generics?

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"
}
Copier après la connexion

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
}
Copier après la connexion

Vous pouvez également utiliser new(T):

func (f FruitFactory[T]) Create() *T {
    return new(T)
}
Copier après la connexion

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}
}
Copier après la connexion

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