Какой текст появится в консоли при запуске программы №18

Исходник не компилируется: переменной myError присваивается *myError, даже несмотря на if false. Если убрать &, функция вернёт ненулевой error с текстом code: 0.

Короткий ответ

Что ответить на собеседовании

Исходник не компилируется: переменной 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 явно в успешной ветке.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее