Пустой получатель в Go
Метод указателя можно вызвать даже тогда,
когда указатель пустой, если сам метод это
проверяет. Значение nil в переменной
типа *User не мешает входу в метод,
пока код не обращается к полям без проверки.
Сделаем печать имени с заглушкой для пустого получателя:
import "fmt"
type User struct {
Name string
Age int
}
func (u *User) ShowName() {
if u == nil {
fmt.Println("unknown")
return
}
fmt.Println(u.Name)
}
Создадим пустой указатель и вызовем метод:
var u *User
u.ShowName()
На экране "unknown". Программа не
остановилась: метод увидел пустой указатель
и вышел через return до чтения Name.
Без такой проверки обращение к полю при
nil привело бы к ошибке выполнения.
Тот же метод сработает и у обычного значения,
если указатель на него не пустой. Проверка
u == nil остается первым шагом, когда
метод должен терпимо вести себя при отсутствии
данных.
Дана структура:
package main
import "fmt"
type User struct {
Name string
Age int
}
var u *User
Добавьте метод указателя, который при пустом
получателе печатает "empty", иначе
имя. Вызовите его у u.
Даны переменные:
package main
import "fmt"
type Note struct {
Text string
}
var a *Note
b := &Note{Text: "hi"}
Запишите метод указателя с проверкой на
nil и выведите результат для a
и b.
Что произойдет при вызове метода указателя без проверки, если внутри сразу читают поле структуры?