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
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.
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, dassx
nichtnil
ist und dass der inx
gespeicherte Wert vom TypT
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:
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:
Oder besser: Verwenden Sie das spezielle "Komma-OK" -Formular:
%Vor%Verwenden Sie das "Komma-OK" -Formular:
Der Wert von
ok
isttrue
, wenn die Assertion gültig ist. Ansonsten ist esfalse
und der Wert vonn
ist der Nullwert für den TypT
. In diesem Fall tritt keine Laufzeitpanik auf.