为了账号安全,请及时绑定邮箱和手机立即绑定

GoLang 上的接口函数调用

GoLang 上的接口函数调用

Go
PIPIONE 2022-01-10 17:05:55
我有一个问题去接口。这是我的 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.Firstmain.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()


查看完整回答
反对 回复 2022-01-10
  • 1 回答
  • 0 关注
  • 278 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号