在函数参数中传递接口指针

我试图理解 Golang (1.12) 接口。我发现接口指针必须显式取消引用,与结构不同:


import "fmt"


// A simple interface with one function

type myinter interface {

    hello()

}


// Implement myinter

type mystruct struct {}


func (mystruct) hello() {

    fmt.Println("I am T!")

}


// Some function that calls the hello function as defined by myinter

func callHello(i *myinter) {   

    i.hello()  // <- cannot resolve reference 'hello'

}


func main() {

    newMystruct := &mystruct{}

    callHello(newMystruct)

}

在这里,我的函数无法解析接口中定义的callHello对我的函数的引用。hello当然,取消引用接口是可行的:


func callHello(i *myinter) {   

    (*i).hello()  // <- works!

}

但在结构体中,我们可以直接调用函数,不需要这种繁琐的解引用符号:


func callHello(s *mystruct) {   

    s.hello()  // <- also works!

}

为什么会这样呢?我们必须显式取消引用指针是否有原因interface?Go 是否试图阻止我将interface指针传递给函数?


隔江千里
浏览 116回答 3
3回答

慕尼黑5688855

Go 是否试图阻止我将接口指针传递给函数?是的。在(几乎*)所有情况下,接口指针都是错误的。(* 在非常罕见和微妙的情况下,指针到接口是有意义的,但很有可能您每 5 年不会看到它们超过一次。)(挑剔:该语言称为“Go”。“golang.org”是网站。类似的基础知识包含在兼容性承诺中,并且不依赖于版本:Go 1.0、1.12 和 1.16 在这方面的行为完全相同.)

www说

它与类型系统的工作方式有关。接口类型I定义了方法集。方法集是为 type 定义的I,而不是为 type 定义的*I。正因为如此,其使用*I受到限制。当函数要设置接口值时可以使用它,但很少见:func f(x *error) {&nbsp; *x = fmt.Errorf("Some error")}请注意,接口本身可以有一个底层指针值:func f(x someInterface) {&nbsp; &nbsp;*x.(*someType) = value}func main() {&nbsp; &nbsp;x := someType{}&nbsp; &nbsp;f(&x)}这对于非接口类型是不同的。当您为非接口类型 定义方法时,该方法同时为和T定义。如果您为 定义方法,则它仅是为 定义的,而不是为 定义的。T*T*T*TT

料青山看我应如是

只需移除指针即可使用该界面。func callHello(i myinter) {&nbsp; &nbsp;&nbsp; &nbsp; i.hello()&nbsp;&nbsp;}该 func 现在将接受实现该接口的结构实例,或指向实现该接口的结构实例的指针。func main() {&nbsp; &nbsp; instance := mystruct{}&nbsp; &nbsp; pointer := &mystruct{}&nbsp; &nbsp; callHello(instance)&nbsp; &nbsp; callHello(pointer)}输出以下内容:I am T!I am T!&nbsp;Program exited.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go