Heim >Backend-Entwicklung >Golang >Warum schlägt in Go eine Nil-Schnittstelle-zu-Zeiger-Konvertierung fehl?
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 *
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!