Проверяет понимание механики nil
В Go можно вызывать методы на nil-указателях, если метод не обращается к данным объекта. Если же происходит доступ к полям или вызов других методов, будет panic.
В Go nil — это нулевое значение для ссылочных типов, включая указатели, карты, срезы, каналы, интерфейсы и функции. В отличие от многих языков, Go допускает вызов методов на nil-указателях, если реализация метода не требует обращения к памяти, на которую должен указывать этот указатель. Это часто используется для упрощения API, когда метод может обрабатывать как полноценный объект, так и пустое состояние. Однако если внутри метода произойдёт обращение к полям структуры через nil-указатель, программа завершится panic. Например, метод с ресивером func (p *Person) Greet() может работать с nil, если проверит if p == nil и вернёт сразу, но при попытке сделать p.Name на nil будет ошибка. Такое поведение полезно, например, для безопасных no-op методов в логгерах или обработчиках событий. Стоит помнить, что у nil-значений интерфейсов и nil-указателей на структуры есть важное различие: интерфейс, содержащий nil-указатель, не является полностью nil, и это может влиять на проверки if x == nil.
Пример:
type Person struct{ Name string }
func (p *Person) Greet() {
if p == nil {
fmt.Println("No person")
return
}
fmt.Println("Hello,", p.Name)
}
func main() {
var p *Person
p.Greet() // No person
}Вывод: Нужно проектировать методы так, чтобы они безопасно работали с nil, если это ожидаемое поведение.