Heim >Backend-Entwicklung >Golang >Wie konvertiert man Null-Schnittstellen in Go sicher in Zeiger?

Wie konvertiert man Null-Schnittstellen in Go sicher in Zeiger?

Barbara Streisand
Barbara StreisandOriginal
2024-12-04 08:01:12267Durchsuche

How to Safely Convert Nil Interfaces to Pointers in Go?

Null-Schnittstellen in Zeiger in Go konvertieren

In Go kann die Konvertierung einer Null-Schnittstelle in einen Zeiger eines bestimmten Typs zu einem Fehler führen . Im bereitgestellten Beispielcode:

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) // prints true
    n = p.(*Node) // fails
}

Dies schlägt fehl, weil eine statische Schnittstelle (Nexter) Werte verschiedener dynamischer Typen, einschließlich Null, enthalten kann. Die Typzusicherung (p.(*Node)) kann nicht für einen Null-Schnittstellenwert durchgeführt werden.

Es ist jedoch möglich, einem Zeiger eines bestimmten Typs direkt einen Nullwert zuzuweisen:

n = (*Node)(nil)

Dadurch wird n ein Nullwert mit dem dynamischen Typ *Node zugewiesen.

Um Null-Schnittstellenwerte zu verarbeiten, können Sie diese überprüfen explizit:

if p != nil {
    n = p.(*Node) // only succeeds if p contains a value of type *Node
}

Alternativ können Sie die Form „Komma-OK“ verwenden:

if n, ok := p.(*Node); ok {
    // n is not nil and holds a value of type *Node
}

Die Verwendung der Form „Komma-OK“ stellt sicher, dass die Behauptung niemals fehlschlägt und einen booleschen Wert zurückgibt ob die Behauptung gilt, statt Panik auszulösen. Dadurch können Sie sowohl Null- als auch Nicht-Null-Schnittstellenwerte sicher verarbeiten.

Das obige ist der detaillierte Inhalt vonWie konvertiert man Null-Schnittstellen in Go sicher in 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