Давайте рассмотрим интерфейс как указатель.
Скажем, у вас есть указатель a
, и он равен нулю, и ничего не указывает.
var a *int // nil
Тогда у вас есть указатель b
, и он указывает на a
.
var b **int
b = &a // not nil
Посмотрите, что произошло? b
указывает на указатель, который указывает на ничего. Так что даже если это указатель nil в конце цепочки, b
указывает на что-то - это не ноль.
Если вы заглянете в память процесса, это может выглядеть так: это:
address | name | value
1000000 | a | 0
2000000 | b | 1000000
Видите? a
указывает на адрес 0 (это означает, что он nil
), а b
указывает на адрес a
(1000000).
То же самое относится к интерфейсам (за исключением того, что они немного в памяти ).
Как и указатель, интерфейс, указывающий на указатель на nil, не будет нить.
Здесь см. себя , как это работает с указателями и , как это работает с интерфейсами .