GoLang 上的接口函数调用

我有一个问题去接口。


这是我的 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”。我错过了什么?


谢谢你的帮助。


PIPIONE
浏览 279回答 1
1回答

手掌心

对什么是接口存在误解。在 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()。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go