In Go stellt das Fehlen eines Nullwerts in der Sprache eine Herausforderung dar, wenn ein leerer oder Standardwert für zurückgegeben wird generische Typen.
Beachten Sie die folgende generische Liste Implementierung:
type mylist[T any] struct { first *node[T] } type node[T any] struct { data T next *next[T] }
In diesem Beispiel könnten wir Methoden zum Öffnen und Abrufen des ersten Elements aus der Liste definieren:
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 }
Beim Kompilieren dieses Codes löst der Compiler jedoch einen Fehler aus ein Fehler: „Null kann nicht als T-Wert in der Rückgabeanweisung verwendet werden.“ Dies liegt daran, dass Go einer generischen Typvariablen T nicht implizit Null zuweisen kann.
Anstatt Null zurückzugeben, können wir den Nullwert für den spezifischen verwendeten Typ T zurückgeben in der generischen Liste. Der Nullwert ist:
Um dies zu erreichen, können wir eine Variable vom Typ T deklarieren und zurückgeben:
func getZero[T any]() T { var result T return result }
Diese Funktion kann jetzt sein Wird verwendet, um den Nullwert für jeden generischen Typ zurückzugeben. Wir können es beispielsweise für verschiedene Typen testen:
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)
Ausgabe:
int 0 string "" image.Point (0,0) *float64 <nil>
Mit dieser Lösung können Sie für jeden generischen Typ in Go einen ordnungsgemäßen Standardwert oder einen leeren Wert zurückgeben.
Das obige ist der detaillierte Inhalt vonWie kann ich mit Standardwertrückgaben für generische Typen in Go umgehen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!