Sobes.tech
Back to questions
Senior
3

Что будет, если функция объявляет переменную типа *структура, присваивает ей nil через new, и возвращает интерфейс error?

Companies where asked
А7

Answer from AI

sobes.tech AI

Если функция объявляет переменную типа структуры, выделяет память через new и присваивает ей nil, а затем возвращает интерфейс error, то поведение зависит от того, что именно возвращается.

В Go интерфейс содержит два поля: тип и значение. Если возвращается переменная интерфейса error, которая содержит указатель на структуру, равный nil, то интерфейс не будет равен nil, потому что тип внутри интерфейса задан.

Пример:

func f() error {
    var s *MyStruct = new(MyStruct) // s указывает на выделенную память
    s = nil                         // теперь s равен nil
    return s                        // возвращаем s как error
}

func main() {
    err := f()
    if err == nil {
        fmt.Println("err is nil")
    } else {
        fmt.Println("err is NOT nil")
    }
}

В этом примере err будет не равен nil, потому что интерфейс содержит тип *MyStruct, но значение nil. Это частая ловушка в Go.

Чтобы вернуть настоящий nil интерфейс, нужно возвращать nil самого интерфейса, например:

return nil

а не указатель nil.

Итого: если возвращать nil указатель на структуру как error, то интерфейс не будет равен nil, что может привести к неожиданному поведению при проверках на nil.