Однако в Go функция, вызываемая синтаксисом Expression.Name()
, полностью определяется типом выражения, а не конкретным значением времени выполнения этого выражения, включая nil - copyied
Таким образом, мы можем вызвать method
, используя экземпляр структуры, который равен nil.
Рассмотрим следующую программу:
package main
import "fmt"
type T struct {
V int
tt *T
}
func (t *T) hello() string {
return "world"
}
func main() {
var t *T = nil
fmt.Println(t, t.hello()) // <nil> world
fmt.Println(t, t.tt.hello()) // panic
}
Почему fmt.Println(t, t.hello())
сработал?
Но
fmt.Println(t, t.tt.hello())
запаниковал ?.
Насколько я понимаю, t
и t.tt
являются nil
указателями.Так что t.tt.hello()
не должно паниковать, так как в golang разрешен вызов метода с указателем структуры nil.