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
DDDOriginal
2024-12-19 14:01:16188Durchsuche

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
}

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)

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
}

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

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

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!

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