Qux.DoBar()
имеет указатель приемника, поэтому только *Qux
реализует Bar
, но не Qux
.Тип Qux
и тип указателя на него *Qux
- это разные типы с разными наборами методов .
Использование значения типа *Qux
действительно реализует Bar
:
Check(&Qux{bar: bar{name: "*Qux"}})
Это выводит (попробуйте на Go Playground ):
*Qux has Nameable
*Qux has Bar: DoBar
Также, если вы измените приемник Qux.DoBar()
, чтобы он не был указателем:
func (q Qux) DoBar() string {
return "DoBar"
}
Тогда и Qux
, и *Qux
будут реализовывать Bar
:
Check(bar{name: "bar"})
Check(Qux{bar: bar{name: "Qux"}})
Check(&Qux{bar: bar{name: "*Qux"}})
Выход (попробуйте на Go Playground ):
bar has Nameable
Qux has Nameable
Qux has Bar: DoBar
*Qux has Nameable
*Qux has Bar: DoBar
См. Связанный вопрос: X не реализует Y (... метод имеет получатель указателя)