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
Freigeben: 2024-12-31 18:57:22
Original
527 Leute haben es durchsucht

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]
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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)
Nach dem Login kopieren

Ausgabe:

int 0
string ""
image.Point (0,0)
*float64 <nil>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage