Назад к вопросам
Senior
3
type someInterface interface { someFunc() } type A struct { } func(a A) someFunc() { } type B struct { A } type C struct { some A }
Компании, где спрашивали
Финтехробот
Ответ от нейросети
sobes.tech AI
В представленном коде на Go показаны интерфейс и структуры с встраиванием.
- Интерфейс
someInterfaceопределяет методsomeFunc(). - Структура
Aреализует методsomeFunc(), значит,Aудовлетворяет интерфейсуsomeInterface. - Структура
BвстраиваетAанонимно, то есть получает все методыAи, соответственно, тоже реализуетsomeInterfaceчерез встраивание. - Структура
Cсодержит полеsomeтипаAс именованным полем, поэтому методыAне «поднимаются» вCавтоматически. Следовательно,Cне реализуетsomeInterface, если явно не реализует методsomeFunc().
Пример:
package main
import "fmt"
type someInterface interface {
someFunc()
}
type A struct {}
func (a A) someFunc() {
fmt.Println("A's someFunc")
}
type B struct {
A // анонимное встраивание
}
type C struct {
some A // именованное поле
}
func main() {
var i someInterface
a := A{}
b := B{}
c := C{}
i = a // OK
i.someFunc()
i = b // OK, через встраивание
i.someFunc()
// i = c // Ошибка компиляции: C не реализует someInterface
// Чтобы C реализовал интерфейс, нужно явно реализовать метод:
// func (c C) someFunc() { c.some.someFunc() }
}
Таким образом, анонимное встраивание позволяет структуре автоматически реализовывать интерфейсы, если вложенный тип их реализует, а именованное поле — нет.