Heim >Backend-Entwicklung >Golang >Wie kann ich mit Standardwertrückgaben für generische Typen in Go umgehen?

Wie kann ich mit Standardwertrückgaben für generische Typen in Go umgehen?

Barbara Streisand
Barbara StreisandOriginal
2024-12-31 18:57:22583Durchsuche

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

Implementieren von Standardwertrückgaben für generische Typen in Go

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.

Einschränkungen von Null-Rückgaben

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.

Lösung: Den Nullwert zurückgeben

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:

  • Null für Zeiger
  • Leerer String für Strings
  • 0 für Ganzzahlen und Gleitkommazahlen

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn