Выбор ответа Middle Структуры, методы и интерфейсы спрашивают часто обновлено
Интерфейс с nil-указателем не равен nil
Вопрос
Что выведет код?
type MyErr struct{}
func (*MyErr) Error() string { return "err" }
func get() error {
var p *MyErr
return p
}
func main() {
fmt.Println(get() == nil)
}
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: false. Значение интерфейса это пара (динамический тип, указатель на данные). get возвращает интерфейс error с типом MyErr и nil-указателем внутри.
Варианты ответа
truefalseправильный ответ- panic: nil pointer dereference
- Ошибка компиляции
Разбор
Значение интерфейса это пара (динамический тип, указатель на данные). get возвращает интерфейс error с типом *MyErr и nil-указателем внутри. Интерфейс равен nil, только когда пусты обе части, поэтому сравнение даёт false. Паники нет: никто не разыменовывает указатель. Исправление: в успешном случае возвращать литерал nil.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Набор методов и реализация интерфейса
Следующий вопрос
Ресивер по значению или указателю
Ещё по теме «Структуры, методы и интерфейсы»
- LRU-кеш на Go: map и двусвязный список
- Очередь с приоритетом через container/heap на Go
- Площади фигур через интерфейс Shape на Go
- Сортировка структур по нескольким ключам на Go
- Что выведет Go: встраивание и вызов метода
- Что выведет Go: интерфейс хранит копию значения
- Что выведет Go: method value и defer копируют ресивер
- Что выведет Go: nil-указатель в интерфейсе error