Heim >Backend-Entwicklung >Golang >Warum schlägt in Go eine Nil-Schnittstelle-zu-Zeiger-Konvertierung fehl?

Warum schlägt in Go eine Nil-Schnittstelle-zu-Zeiger-Konvertierung fehl?

Barbara Streisand
Barbara StreisandOriginal
2024-11-30 13:08:11458Durchsuche

Why Does a Nil Interface to Pointer Conversion Fail in Go?

Nil Interface to Pointer Conversion in Go

In Go kann ein Schnittstellentyp Werte verschiedener konkreter Typen enthalten, die ihn implementieren. Der Versuch, eine Null-Schnittstelle in einen Zeiger eines bestimmten Typs zu konvertieren, kann jedoch zu dem Fehler „Schnittstellenkonvertierung: Schnittstelle ist Null, nicht *“ führen. Dieser Fehler tritt auf, weil die Typzusicherung, die zum Konvertieren einer Schnittstelle in einen bestimmten Typ verwendet wird, einen Schnittstellenwert ungleich Null erfordert.

Um dieses Verhalten zu verstehen, betrachten Sie den Codeausschnitt aus der Frage:

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: interface conversion: interface is nil, not *main.Node
}

Das Problem tritt auf, wenn versucht wird, den Wert von p mit der Typzusicherung p.(*Node) n zuzuweisen. Diese Behauptung schlägt fehl, weil die p-Variable Null ist, was darauf hinweist, dass sie keinen konkreten Wert enthält.

Alternativ ist der folgende Ausdruck:

n = (*Node)(nil)

erfolgreich, weil er die n-Variable explizit auf setzt ein Nullzeiger vom Typ *Node. Dies ist möglich, weil ein Schnittstellenwert aus einem Paar von (Wert, dynamischer Typ) besteht und das Setzen eines Schnittstellenwerts auf Null zu einem Paar von (Null, Null) führt.

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

if p != nil {
    n = p.(*Node)  // Only succeeds if `p` holds a value of type `*Node`
}

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

if n, ok := p.(*Node); ok {
    fmt.Printf("n=%#v\n", n)  // Never fails, assigns zero value to `n` if `p` is nil
}

Zusammenfassend lässt sich sagen, dass der Versuch, eine Null-Schnittstelle mithilfe der Typzusicherung in einen Zeiger eines bestimmten Typs umzuwandeln, fehlschlägt, das explizite Setzen auf Null jedoch erfolgreich sein wird. Um Null-Schnittstellenwerte zu verarbeiten, können explizite Prüfungen oder die „Komma-OK“-Form der Typzusicherung verwendet werden.

Das obige ist der detaillierte Inhalt vonWarum schlägt in Go eine Nil-Schnittstelle-zu-Zeiger-Konvertierung fehl?. 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