Что выведет код 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 ошибок.