Интерфейс — это набор сигнатур методов. Любой тип, который реализует все методы интерфейса, автоматически его удовлетворяет (implicit implementation, без implements).
type Writer interface {
Write(p []byte) (n int, err error)
}
type MyWriter struct{}
func (w MyWriter) Write(p []byte) (int, error) {
// MyWriter автоматически реализует Writer
return len(p), nil
}
Пустой интерфейс interface{} (или any с Go 1.18) принимает значение любого типа. Под капотом интерфейс — это пара (type, value). Если оба nil, интерфейс равен nil. Но если type не nil, а value nil — интерфейс не nil, это частая ловушка.