Я тут недавно покопался в сгенерированных протобафом коде и обнаружил интересные проверки на которые раньше не обращал внимания типа
func (x *Limits) GetLimits() []*Limit {
if x != nil {
return x.Value
}
return nil
}
Стало интересно, по бырому наваял проверку чтобы прям ручками посмотреть
type someStruct struct {
val int64
}
func (s *someStruct) Val() {
if s != nil {
log.Info("s != nil")
} else {
log.Error("s is nil!")
}
}
func Some(s *someStruct) {
s.Val()
}
func main() {
s := &someStruct{}
s.Val()
s = nil
Some(s)
}
Вывод как и ожидалось
INFO[0000] s != nil
ERRO[0000] s is nil!
То бишь мы буквально у нулла можем вызывать методы.
Я понимаю что
func (s *someStruct) Val()
Это синтаксический сахар для
func Val(s *someStruct)
Но выглядит довольно такие интересно.
Но мне интересно часто ли это используется в коде? (проверка на нил ссылки внутри метода этой же структуры) Я допустим только в протобафе такое встречал, в обычном коде я такое не помню что бы видел..... Кто использует?