这是我想要展示的一个例子。
在这个例子中:
我提出这个问题的原因是当接口 A、B和结构体 C、CA位于不同的包中时,我只能做以下两种选择:
package main
import "fmt"
// interface declaration
//
type A interface {
AAA() string
}
type B interface{
Get() A
}
// implementation
//
type CA struct {}
// implementation of A.AAA
func (ca *CA) AAA() string {
return "it's CA"
}
type C struct {}
// implementation of B.Get, except for returning a 'struct' instead of an 'interface'
func (c *C) Get() *CA {
return &CA{}
}
func main() {
var c interface{} = &C{}
d := c.(B)
fmt.Println(d.Get().AAA())
fmt.Println("Hello, playground")
}
在这个例子中:
- 接口
B
有一个方法Get
,用于返回一个接口A
- 结构体
C
有一个成员函数Get
,用于返回指向实现接口A
的结构体CA
的指针
C
推断出接口 B
,即使它们的 Get
方法只有返回类型不同,但可转换。我提出这个问题的原因是当接口 A、B和结构体 C、CA位于不同的包中时,我只能做以下两种选择:
- 将
C
的 Get 方法精化为 func Get() A,这会在包之间引入一些依赖关系。 - 将接口
B
和结构体C
的 Get 方法都精化为 func Get() interface{}