【问题标题】:Pointer and Struct member function指针和结构成员函数
【发布时间】:2017-02-27 23:08:03
【问题描述】:

调用函数

当我定义一个结构 Lock 和一个函数 Test 时,结构 Lock 作为函数接收者

type Lock struct {
}

func (self Lock) Test() {
    fmt.Println("Test Func")
}

我发现我可以用Lock结构指针调用这个函数

lock := &Lock{}
lock.Test()

同样,如果我定义一个struct Lock和一个函数Test作为Lock的指针作为接收者,我可以通过Lockstruct实例调用这个函数。

所以无论接收者是结构本身还是结构指针,我都可以通过两者来调用这个函数吗?什么原因。按照我的理解,结构体和结构体指针是完全不同的两种类型!

界面

如果像这样定义一个接口Locker

type Locker interface {
    Test()
}

并定义一个结构Lock和一个函数Test,结构instance作为接收者,我不能将结构指针变量分配给Locker接口变量。

相反,如果定义一个结构体Lock和一个函数Test以结构体指针为接收者,将结构体实例变量分配给Locker接口var可以工作!

我对语言设计感到很困惑。谁能给我一些建议?

【问题讨论】:

  • 你在selectors上寻找规则
  • 看一下语言规范,尤其是方法集部分。当然还有:再次体验围棋之旅。

标签: go


【解决方案1】:

通常,Go 会在后台为你做一些事情,这通常是其中一种情况。

当你定义一个以结构体为接收者的函数并将一个指向该结构体的指针传递给它时,Go 会为你进行转换:它传递一个指向的结构体的副本。

当你定义一个带有指针的函数作为接收者并传递一个结构体时,Go 会创建一个指向这个结构体的指针。

但是,在定义接口时,您正在处理类型:Locker 接口定义了实现函数 Test() 的类型。

对于接口,Go 帮不了你:如果你的类型没有实现方法,那么它就没有实现接口。这里没有隐藏的转化。

通常,最好清楚你想要什么以及你想要它的方式,从而防止 Go 进行那些奇怪的转换。

【讨论】:

  • 不完全准确。 Go 仍然为接口进行的转换。规则是,如果将指向类型的指针传递给接口,则该类型上的指针和值方法都可以实现接口。如果传入类型本身,则只有该类型的值方法才能实现接口。示例:play.golang.org/p/rUIeMBnXTY
  • 感谢您的回答!它真的帮助我解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多