Nil-Schnittstelle in Pointer von etwas in Golang konvertieren?

8

Im folgenden Codebeispiel schlägt der Versuch, eine nil-Schnittstelle in einen Zeiger von etwas zu konvertieren, mit dem folgenden Fehler fehl: interface conversion: interface is nil, not *main.Node

%Vor%

Link hier abspielen: Ссылка

Warum scheitert das genau? Es ist durchaus möglich,

zu tun %Vor%

, also frage ich mich, wie Sie einen ähnlichen Effekt ausgehend von einer Null-Schnittstelle erreichen können.

    
Mihnea Giurgea 11.05.2015, 07:51
quelle

1 Antwort

22

Dies liegt daran, dass eine Variable vom statischen -Typ Nexter (die nur eine Schnittstelle ist) Werte vieler verschiedener dynamischer -Typen enthalten kann.

Ja, da *Node implementiert Nexter , Ihre p Variable kann einen Wert vom Typ *Node enthalten, aber es kann andere Typen enthalten Nun, welche implementieren Nexter ; oder es kann nichts enthalten ( nil value). Und die Typassertion kann hier nicht verwendet werden, weil sie aus der Spezifikation zitiert:

  

x.(T) bestätigt, dass x nicht nil ist und dass der in x gespeicherte Wert vom Typ T ist.

Aber x ist in deinem Fall nil . Und wenn die Typassertion falsch ist, tritt eine Laufzeitpanik auf .

Wenn Sie Ihr Programm ändern, um Ihre p Variable mit:

zu initialisieren %Vor%

Ihr Programm wird ausgeführt und die Assertion wird erfolgreich eingegeben. Dies liegt daran, dass ein Interface-Wert tatsächlich ein Paar in der Form: (value, dynamic type) enthält, und in diesem Fall ist p nicht nil , sondern enthält ein Paar (nil, *Node) ; Details siehe Die Gesetze der Reflexion #Die Darstellung einer Schnittstelle .

Wenn Sie auch nil -Werte von Schnittstellentypen behandeln wollen, können Sie dies explizit wie folgt überprüfen:

%Vor%

Oder besser: Verwenden Sie das spezielle "Komma-OK" -Formular:

%Vor%

Verwenden Sie das "Komma-OK" -Formular:

  

Der Wert von ok ist true , wenn die Assertion gültig ist. Ansonsten ist es false und der Wert von n ist der Nullwert für den Typ T . In diesem Fall tritt keine Laufzeitpanik auf.

    
icza 11.05.2015, 08:02
quelle

Tags und Links