Sobes.tech
Назад к вопросам
Middle+
4

Расскажи про интерфейсы в Go: что это, из чего состоят, что такое nil-интерфейс?

Компании, где спрашивали
YadroYadro

Ответ от нейросети

sobes.tech AI

В Go интерфейс — это набор методов, которые должен реализовать тип, чтобы считаться этим интерфейсом. Интерфейс описывает поведение, а не структуру данных.

Интерфейс состоит из списка сигнатур методов, например:

type Reader interface {
    Read(p []byte) (n int, err error)
}

Любой тип, который реализует метод Read([]byte) (int, error), автоматически удовлетворяет интерфейсу Reader.

Nil-интерфейс — это интерфейс, который не содержит ни значения, ни типа. Его значение равно nil. Важно понимать, что интерфейс в Go — это пара: (тип, значение). Если и тип, и значение равны nil, то интерфейс считается nil. Если тип есть, а значение nil — интерфейс не равен nil.

Пример:

var r io.Reader // r == nil

var p *os.File = nil
r = p // r != nil, так как тип *os.File, хотя значение nil

if r == nil {
    fmt.Println("r is nil")
} else {
    fmt.Println("r is not nil")
}

Это часто вызывает путаницу при проверках на nil с интерфейсами.