Renvoi des valeurs par défaut pour les types génériques dans Go
Dans Go, comment pouvez-vous renvoyer une valeur par défaut pour un type générique T ? Considérez le code suivant :
type mylist[T any] struct { first *node[T] } type node[T any] struct { data T next *node[T] } 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 }
Lorsque vous essayez de compiler ce code, vous pouvez rencontrer l'erreur :
cannot use nil as T value in return statement
Le problème du retour de Nil
Renvoyer nil pour un type générique n'est pas autorisé dans Go. En effet, nil n'est pas une valeur valide pour tous les types. Par exemple, si T est un entier, renvoyer zéro n’aurait aucun sens. De même, nil n'est pas une valeur valide pour les structures.
Renvoi de la valeur zéro
Au lieu de renvoyer nil, vous devez renvoyer la valeur zéro pour l'argument de type utilisé pour T. La valeur zéro est nulle pour les pointeurs et les tranches, la chaîne vide pour les chaînes et 0 pour les entiers et les virgules flottantes. nombres.
Pour renvoyer la valeur zéro, vous pouvez déclarer une variable de type T et la renvoyer :
func getZero[T any]() T { var result T return result }
Test de la fonction de valeur zéro
Voici un exemple de comment tester le getZero function :
package main import "fmt" func main() { 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>
Cela montre que la fonction getZero renvoie les valeurs zéro attendues pour différents types.
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!