Назад к вопросам
Yadro
Middle+
4
Расскажи про интерфейсы в Go: что это, из чего состоят, что такое nil-интерфейс?
Компании, где спрашивали
Ответ от нейросети
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 с интерфейсами.