Maison >développement back-end >Golang >Comment puis-je gérer les retours de valeurs par défaut pour les types génériques dans Go ?

Comment puis-je gérer les retours de valeurs par défaut pour les types génériques dans Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-31 18:57:22524parcourir

How Can I Handle Default Value Returns for Generic Types in Go?

Implémentation des retours de valeurs par défaut pour les types génériques dans Go

Dans Go, l'absence de valeur nulle dans le langage présente un défi lors du renvoi d'une valeur vide ou par défaut pour types génériques.

Limitations des retours nuls

Considérez la liste générique suivante implémentation :

type mylist[T any] struct {
    first *node[T]
}

type node[T any] struct {
    data T
    next *next[T]
}

Dans cet exemple, nous pourrions définir des méthodes pour afficher et récupérer le premier élément de la liste :

func (list *mylist[T]) pop() T {
    if list.first != nil {
        data := list.first.data
        list.first = list.first.next
        return data
    }
    return nil
}

func (list *mylist[T]) getfirst() T {
    if list.first != nil {
        return list.first.data
    }
    return nil
}

Cependant, lors de la compilation de ce code, le compilateur lèvera une erreur : "impossible d'utiliser nil comme valeur T dans l'instruction return." Cela se produit parce que Go ne peut pas implicitement attribuer nil à une variable de type générique T.

Solution : renvoyer la valeur zéro

Au lieu de renvoyer nil, nous pouvons renvoyer la valeur zéro pour le type spécifique T utilisé. dans la liste générique. La valeur zéro est :

  • Nil pour les pointeurs
  • Chaîne vide pour les chaînes
  • 0 pour les entiers et les nombres à virgule flottante

Pour y parvenir, nous pouvons déclarer une variable de type T et la renvoyer :

func getZero[T any]() T {
    var result T
    return result
}

Cette fonction peut maintenant être utilisé pour renvoyer la valeur zéro pour tout type générique. Par exemple, nous pouvons le tester pour différents types :

i := getZero[int]()
fmt.Printf("%T %v\n", i, i)

s := getZero[string]()
fmt.Printf("%T %q\n", s, s)

p := getZero[image.Point]()
fmt.Printf("%T %v\n", p, p)

f := getZero[*float64]()
fmt.Printf("%T %v\n", f, f)

Sortie :

int 0
string ""
image.Point (0,0)
*float64 <nil>

Cette solution vous permet de renvoyer une valeur par défaut ou vide appropriée pour tout type générique dans Go.

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