Standardwerte für generische Typen in Go zurückgeben
Wie können Sie in Go einen Standardwert für einen generischen Typ T zurückgeben? Betrachten Sie den folgenden Code:
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 }
Beim Versuch, diesen Code zu kompilieren, kann der Fehler auftreten:
cannot use nil as T value in return statement
The Issue of Returning Nil
Die Rückgabe von Null für einen generischen Typ ist in Go nicht zulässig. Dies liegt daran, dass Null nicht für alle Typen ein gültiger Wert ist. Wenn T beispielsweise eine Ganzzahl ist, wäre die Rückgabe von Null bedeutungslos. Ebenso ist Null kein gültiger Wert für Strukturen.
Rückgabe des Nullwerts
Anstatt Null zurückzugeben, sollten Sie den Nullwert für das verwendete Typargument zurückgeben T. Der Nullwert ist Null für Zeiger und Slices, der leere String für Strings und 0 für Ganzzahlen und Gleitkommazahlen Zahlen.
Um den Nullwert zurückzugeben, können Sie eine Variable vom Typ T deklarieren und zurückgeben:
func getZero[T any]() T { var result T return result }
Testen der Nullwertfunktion
Hier ist ein Beispiel, wie man getZero testet Funktion:
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) }
Ausgabe:
int 0 string "" image.Point {0, 0} *float64 <nil>
Dies zeigt, dass die getZero-Funktion die erwarteten Nullwerte für verschiedene Typen zurückgibt.
Das obige ist der detaillierte Inhalt vonWie gebe ich in Go Standardwerte für generische Typen zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!