Heim > Backend-Entwicklung > Golang > Wie kann ich in Go eine Nil-Schnittstelle sicher in einen Zeiger konvertieren?

Wie kann ich in Go eine Nil-Schnittstelle sicher in einen Zeiger konvertieren?

Linda Hamilton
Freigeben: 2024-12-07 06:57:11
Original
637 Leute haben es durchsucht

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

Konvertieren einer Null-Schnittstelle in einen Zeiger eines Typs in Golang

Beim Versuch, eine Null-Schnittstelle in einen Zeiger eines bestimmten Typs zu konvertieren, wird ein Fehler tritt auf: „Schnittstellenkonvertierung: Schnittstelle ist Null“. Um zu verstehen, warum dies fehlschlägt, ist es wichtig, den Unterschied zwischen statischen und dynamischen Typen zu verstehen.

Nexter ist eine Schnittstelle, die einen statischen Typ angibt. Variablen vom Typ Nexter können Werte verschiedener dynamischer Typen enthalten, die die Nexter-Schnittstelle implementieren, z. B. *Node oder andere benutzerdefinierte Typen. Wenn einer Zeigervariablen eine Null-Schnittstellenvariable zugewiesen wird, ist es unmöglich, den tatsächlichen dynamischen Typ des von ihr gehaltenen Werts zu bestimmen (da sie keinen enthält).

Daher kommt es zur Typzusicherung, die normalerweise in verwendet wird Die Form x.(T), um zu behaupten, dass x vom Typ T ist und es in T umzuwandeln, schlägt fehl. Dies liegt daran, dass die Spezifikation der Go-Sprache ausdrücklich besagt, dass x.(T) nur funktioniert, wenn x nicht Null ist. Die Verwendung der Typzusicherung für eine Null-Schnittstellenvariable führt zu einer Laufzeitpanik.

Um einen ähnlichen Effekt wie n = p.(*Node) zu erzielen, jedoch ausgehend von einer Null-Schnittstelle, kann der folgende Ansatz verwendet werden:

var p Nexter = (*Node)(nil)
Nach dem Login kopieren

Ein Schnittstellenwert enthält tatsächlich ein Paar (Wert, dynamischer Typ). In diesem Fall ist p nicht null, sondern enthält ein Paar von (nil, *Node). Dies ermöglicht eine erfolgreiche Typzusicherung auf p.

Alternativ können Sie zur expliziten Verarbeitung von Nullwerten die „Komma-OK“-Form verwenden:

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

Die „Komma-OK“-Form stellt dies sicher Es tritt keine Laufzeitpanik auf und ok ist falsch, wenn die Behauptung fehlschlägt (d. h. p enthält einen Nullwert oder einen Wert eines anderen Typs).

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

Quelle:php.cn
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage