В Go вызов метода с pointer receiver на nil - валидная операция. Метод получает nil как значение receiver:
type List struct {
head *Node
}
func (l *List) Len() int {
if l == nil {
return 0 // корректная обработка nil
}
return l.count()
}
var l *List // nil
fmt.Println(l.Len()) // 0, не паника!
// Но если метод обращается к полям без проверки:
func (l *List) Head() *Node {
return l.head // ПАНИКА: nil pointer dereference
}
Это используется в стандартной библиотеке: например, (*bytes.Buffer)(nil).Len() возвращает 0. Полезно для цепочек вызовов и optional-объектов.
Правило: если метод может быть вызван на nil receiver, добавьте проверку if x == nil в начале.