Исходник не компилируется: переменной myError присваивается *myError, даже несмотря на if false. Если убрать &, функция вернёт ненулевой error с текстом code: 0.
Какой текст появится в консоли при запуске программы №18
Исходник не компилируется: переменной myError присваивается *myError, даже несмотря на if false. Если убрать &, функция вернёт ненулевой error с текстом code: 0.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какой вывод будет получен после выполнения следующей программы.
import (
"fmt"
)
type myError struct {
code int
}
func (e myError) Error() string {
return fmt.Sprintf("code: %d", e.code)
}
func run() error {
var e myError
if false {
e = &myError{code : 123}
}
return e
}
func main () {
err := run()
if err != nil {
fmt.Println("failed to run, error:", err)
} else {
fmt.Println("success")
}
}
Ответ
Исходник не компилируется: переменной myError присваивается *myError, даже несмотря на if false. Если убрать &, функция вернёт ненулевой error с текстом code: 0.
Go проверяет типы и в недостижимой ветке. После исправления e остаётся нулевой структурой, но при возврате как error интерфейс содержит динамический тип myError и не равен nil. main напечатает failed to run, error: code: 0. Для отсутствия ошибки объявляйте var err error либо возвращайте nil явно в успешной ветке.