Heim > Backend-Entwicklung > Golang > Wie konvertiert man in Go sicher eine Nil-Schnittstelle in einen Zeiger?

Wie konvertiert man in Go sicher eine Nil-Schnittstelle in einen Zeiger?

DDD
Freigeben: 2024-12-19 14:01:16
Original
258 Leute haben es durchsucht

How to Safely Convert a Nil Interface to a Pointer in Go?

Fehler bei der Konvertierung einer Nullschnittstelle in einen Zeiger in GoLang

In GoLang wird versucht, eine Nullschnittstelle in einen Zeiger eines bestimmten Typs zu konvertieren, z unten dargestellt, löst einen Fehler aus:

type Nexter interface {
    Next() Nexter
}

type Node struct {
    next Nexter
}

func (n *Node) Next() Nexter {...}

func main() {
    var p Nexter

    var n *Node
    fmt.Println(n == nil) // true
    n = p.(*Node) // error
}
Nach dem Login kopieren

Dieser Fehler tritt auf, weil es sich um eine statische Variable vom Schnittstellentyp handelt (z. B. Nexter) kann Werte verschiedener dynamischer Typen enthalten, einschließlich Null. Während es möglich ist, mit (*Node)(nil) einen Nullwert in einen Zeiger umzuwandeln, kann die Typzusicherung, wie sie im Beispiel verwendet wird, nicht angewendet werden, weil:

x.(T)
Nach dem Login kopieren

erfordert, dass x nicht- ist. nil und vom Typ T. In diesem Fall kann p Werte verschiedener Typen oder nil enthalten.

Stattdessen können explizite Prüfungen erfolgen beschäftigt:

if p != nil {
    n = p.(*Node) // succeeds if p contains a *Node value
}
Nach dem Login kopieren

Alternativ bietet die „Komma-OK“-Form eine sicherere Option:

if n, ok := p.(*Node); ok {
    fmt.Printf("n=%#v\n", n)
}
Nach dem Login kopieren

Die Verwendung der „Komma-OK“-Form ermöglicht die Verarbeitung von Null- und Nicht- Null-Schnittstellenwerte, ohne eine Panik auszulösen.

Das obige ist der detaillierte Inhalt vonWie konvertiert man in Go sicher eine Nil-Schnittstelle in einen Zeiger?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage