Что выведет код Middle Структуры, методы и интерфейсы спрашивают часто обновлено
Что выведет Go: nil-указатель в интерфейсе error
Вопрос
Что выведет программа? Go 1.23, в go.mod указано go 1.23. Каждую строку вывода пишите с новой строки.
package main
import "fmt"
type MyErr struct{}
func (e *MyErr) Error() string { return "my error" }
func check(fail bool) error {
var e *MyErr
if fail {
e = &MyErr{}
}
return e
}
func main() {
err := check(false)
fmt.Println(err == nil, err != nil)
fmt.Printf("%T\n", err)
}
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: false true, *main.MyErr. Функция возвращает интерфейс error, в котором тип MyErr и nil-указатель.
Что выведет
false true
*main.MyErr
Разбор
Функция возвращает интерфейс error, в котором тип *MyErr и nil-указатель. Интерфейс равен nil, только если пусты и тип, и значение, поэтому err == nil ложно. %T показывает динамический тип. Правильно в успешной ветке возвращать литерал nil.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Что выведет Go: method value и defer копируют ресивер
Следующий вопрос
Что выведет Go: ресиверы по значению и указателю
Ещё по теме «Структуры, методы и интерфейсы»
- LRU-кеш на Go: map и двусвязный список
- Очередь с приоритетом через container/heap на Go
- Площади фигур через интерфейс Shape на Go
- Сортировка структур по нескольким ключам на Go
- Что выведет Go: встраивание и вызов метода
- Что выведет Go: интерфейс хранит копию значения
- Что выведет Go: сравнение структур и указателей
- Что выведет Go: type switch