Sobes.tech
Back to questions
Senior
4

type someInterface interface { someFunc() } type A struct { } func(a A) someFunc() { } type B struct { A } type C struct { some A }

Companies where asked
Финтехробот

Answer from AI

sobes.tech AI

В представленном коде на Go показаны интерфейс и структуры с встраиванием.

  1. Интерфейс someInterface определяет метод someFunc().
  2. Структура A реализует метод someFunc(), значит, A удовлетворяет интерфейсу someInterface.
  3. Структура B встраивает A анонимно, то есть получает все методы A и, соответственно, тоже реализует someInterface через встраивание.
  4. Структура 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() }
}

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