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

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

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

Go
隔江千里 2023-07-26 20:01:18
我试图理解 Golang (1.12) 接口。我发现接口指针必须显式取消引用,与结构不同:import "fmt"// A simple interface with one functiontype myinter interface {    hello()}// Implement myintertype mystruct struct {}func (mystruct) hello() {    fmt.Println("I am T!")}// Some function that calls the hello function as defined by myinterfunc 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指针传递给函数?
查看完整描述

3 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

Go 是否试图阻止我将接口指针传递给函数?

是的。

在(几乎*)所有情况下,接口指针都是错误的。

(* 在非常罕见和微妙的情况下,指针到接口是有意义的,但很有可能您每 5 年不会看到它们超过一次。)

(挑剔:该语言称为“Go”。“golang.org”是网站。类似的基础知识包含在兼容性承诺中,并且不依赖于版本:Go 1.0、1.12 和 1.16 在这方面的行为完全相同.)


查看完整回答
反对 回复 2023-07-26
?
www说

TA贡献1775条经验 获得超8个赞

它与类型系统的工作方式有关。接口类型I定义了方法集。方法集是为 type 定义的I,而不是为 type 定义的*I。正因为如此,其使用*I受到限制。当函数要设置接口值时可以使用它,但很少见:


func f(x *error) {

  *x = fmt.Errorf("Some error")

}

请注意,接口本身可以有一个底层指针值:


func f(x someInterface) {

   *x.(*someType) = value

}


func main() {

   x := someType{}

   f(&x)

}

这对于非接口类型是不同的。当您为非接口类型 定义方法时,该方法同时为和T定义。如果您为 定义方法,则它仅是为 定义的,而不是为 定义的。T*T*T*TT


查看完整回答
反对 回复 2023-07-26
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

只需移除指针即可使用该界面。


func callHello(i myinter) {   

    i.hello()  

}

该 func 现在将接受实现该接口的结构实例,或指向实现该接口的结构实例的指针。


func main() {

    instance := mystruct{}

    pointer := &mystruct{}

    callHello(instance)

    callHello(pointer)

}

输出以下内容:


I am T!

I am T!

 

Program exited.


查看完整回答
反对 回复 2023-07-26
  • 3 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信