Maison >développement back-end >Golang >Comment les génériques de Go 1.18 peuvent-ils résoudre le problème de la création de valeurs typées sans provoquer de plantage du programme ?

Comment les génériques de Go 1.18 peuvent-ils résoudre le problème de la création de valeurs typées sans provoquer de plantage du programme ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-06 01:29:09825parcourir

How Can Generics in Go 1.18 Solve the Problem of Creating Typed Values Without Causing Program Crashes?

Comment utiliser les génériques dans Go 1.18 pour créer des valeurs typées

Dans la programmation Go, les génériques permettent la création de code qui fonctionne sur différents types sans avoir besoin d'un casting explicite ou d'assertions de type. Cet article explore comment utiliser des génériques dans Go 1.18 pour créer de nouveaux objets de valeurs typées.

Contexte : exemple de Fruit Factory

Considérez l'exemple simplifié suivant de "Fruit Factory" qui tente de créer de nouvelles instances de fruits de manière générique :

type FruitFactory[T any] struct{}

func (f FruitFactory[T]) Create() *T {
    // How do we create a non-nil fruit here?
    // Returning nil crashes the example.
    return nil
}

type Apple struct {
    color string
}

Dans cet exemple, la tâche consiste à compléter la fonction Créer pour créer une nouvelle instance de type T (c'est-à-dire *Apple dans le cas du type Apple). Cependant, renvoyer simplement nil est insuffisant et provoque le crash du programme lors de l'accès aux propriétés de l'objet.

Solution : création d'objets typés

Il existe deux manières principales de créer un nouvelle instance d'une valeur typée utilisant des génériques dans Go 1.18 :

  1. Déclaratif Affectation : Déclarer une variable typée et renvoyer son adresse :
func (f FruitFactory[T]) Create() *T {
    var a T
    return &a
}
  1. Initialisation avec un nouveau mot-clé : Utiliser new pour allouer et initialiser l'objet :
func (f FruitFactory[T]) Create() *T {
    return new(T)
}

Ces solutions permettent à la fonction de créer une valeur non-pointeur (une ou new(T)) et, si nécessaire, convertissez-le en type pointeur en renvoyant son adresse (&a).

Exemple d'implémentation

Dans la "Fruit Factory" exemple :

func (f FruitFactory[T]) Create() *T {
    var a T
    return &a
}

func example() {
    appleFactory := FruitFactory[Apple]{}
    apple := appleFactory.Create()
    apple.color = "red" // No panic now
}

Cette modification permet de créer un nouvel objet Apple et de définir ses propriétés sans rencontrer de segmentation faute.

Conclusion

Avec les génériques dans Go 1.18, la programmation avec des valeurs saisies est grandement simplifiée. En tirant parti de l'affectation déclarative ou du mot-clé new, il est possible de créer de manière transparente de nouvelles instances de n'importe quel type, éliminant ainsi le besoin de conversion manuelle et d'assertions de type sujettes aux erreurs.

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