我的接口(interface)有问题。
这是我的 main.go 文件;
package main
import (
"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”。我错过了什么?
感谢您的帮助。
最佳答案
对于接口(interface)是什么存在误解。在 go 中,如果一个类型实现了为接口(interface)定义的函数,那么它就实现了一个接口(interface)。因此,在您的代码中,接口(interface) a.First
和 main.Second
是等价的。一个类型同时实现它们或根本不实现。
因此,Rect
类型既是 a.First
又是 main.Second
。 Rect 中的字段 F 意味着它包含另一个实现 First 的类型(或 Second 因为它们是相同的)。
当您调用 r.Area()
时,go 会执行函数 func (r Rect) Area() uint64
。使用 r.F = *n
行,您将接口(interface) Second 分配给 First(它们是等效的,没问题)。但是,如果您尝试调用 r.F.Area()
,它会崩溃,因为 F 不是实现 First 的类型,它是 First。
因此,您应该创建另一个实现 First 的类型,然后将其分配给 r。然后你可以调用 r.F.Area()
。
关于go - Go语言上的接口(interface)函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37298107/