Предположим, у нас есть файлы из пакетов a
и b
package a
type Common interface {
GetSelf() Common
}
type Foo struct{}
func (f Foo) GetSelf() Common {
return f
}
func IsCommon(c interface{}) bool {
_, ok := c.(Common)
return ok
}
package b
type Common interface {
GetSelf() Common
}
type Bar struct{}
func (b Bar) GetSelf() Common {
return b
}
func IsCommon(c interface{}) bool {
_, ok := c.(Common)
return ok
}
, которые используются в тесте пакета
package main
import (
"test/a"
"test/b"
)
func main() {
println("hey")
csa := a.Foo{}
csb := b.Bar{}
if a.IsCommon(csa) {
println("csa is Common of a")
} else {
println("csa is not Common of a")
}
if b.IsCommon(csa) {
println("csa is Common of b")
} else {
println("csa is not Common of b")
}
if a.IsCommon(csb) {
println("csb is Common of a")
} else {
println("csb is not Common of a")
}
if b.IsCommon(csb) {
println("csb is Common of b")
} else {
println("csb is not Common of b")
}
}
Вывод этого:
csa is Common of a
csa is not Common of b
csb is not Common of a
csb is Common of b
Я понимаю, что структуры нарушают сигнатуру функции GetSelf() Common
другого пакета, поскольку возвращаемое значение a.Common
отличается от b.Common
. Есть ли способ иметь интерфейс с методом, который возвращает сам себя, но не должен быть импортирован из другого пакета?
Я пытаюсь это сделать, потому что я пытаюсь реализовать древовидную структуру, которая имеетузлы с дочерними элементами одного и того же интерфейса, но возможны варианты типа.