我有一个问题去接口。这是我的 main.go 文件;package mainimport ( "fmt" "bitbucket.org/xyz/trash/a")// Second -type Second interface { Area() float64}// Area -func Area() float64 { return 2}func main() { r := new(a.Rect) n := new(Second) r.F = *n fmt.Println(r.Area()) }还有我的另一个包裹,a.go;package a// First -type First interface { Area() float64}// Rect -type Rect struct { F First }// Area -func (r Rect) Area() float64 { return 1}我期待这条线fmt.Println(r.Area())打印“2”,而不是“1”。我错过了什么?谢谢你的帮助。
1 回答
手掌心
TA贡献1942条经验 获得超3个赞
对什么是接口存在误解。在 Go 中,如果一个类型实现了为接口定义的函数,那么它就实现了一个接口。因此,在您的代码中,接口a.First和main.Second是等价的。一个类型实现了它们两者或根本不实现。
因此,类型Rect既是 aa.First又是 a main.Second。Rect 中的字段 F 意味着它包含另一种实现 First (或 Second 因为它们是相同的)的类型。
当你调用时r.Area(),go 执行函数func (r Rect) Area() uint64。使用该行r.F = *n,您将接口 Second 分配给 First(它们是等价的,没问题)。但是,如果您尝试调用r.F.Area()它会恐慌,因为 F 不是实现 First 的类型,它是First。
因此,您应该创建另一个实现 First 然后将其分配给 r 的类型。然后就可以调用了r.F.Area()。
- 1 回答
- 0 关注
- 278 浏览
添加回答
举报
0/150
提交
取消
