【发布时间】:2015-10-20 01:37:02
【问题描述】:
这是我想展示的想法的一个例子。
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 - struct
C有一个成员函数Get返回一个指向structCA的指针,它实现了接口A
结果是Go无法从struct C推导出接口B,甚至他们的Get方法也只是返回类型不同,是可以转换的。
我提出这个问题的原因是当 interface A, Bstrong> 和 struct C, CA 在不同的包中时,我只能:
- 将
C的Get方法细化为func Get() A,引入一些包之间的依赖关系。 - 将接口
B的Get方法和结构C都细化为func Get()接口{}
我想避免包之间的依赖,尽量不依赖interface{},谁能给我一些提示? Go 的最佳实践是什么?
【问题讨论】:
标签: go interface type-conversion