【问题标题】:Pointer receiver method compilation problem: Cannot call a pointer method on 'MyObj{}'指针接收器方法编译问题:无法在“MyObj{}”上调用指针方法
【发布时间】:2021-09-27 20:57:18
【问题描述】:

我定义了以下方法:

func (o *MyObj) parse(something string) string {
    // Do stuff
}

这段代码(1)编译得很好:

(&MyObj{}).parse(myString)

这段代码(2)也可以编译:

m := MyObj{}
m.parse(myString)

但是这段代码 (3) 不能编译:

MyObj{}.parse(myString)

出现错误

无法在“MyObj{}”上调用指针方法

我的问题:

  1. 为什么 (2) 会编译?我读到了T method set doesn't include *T method set,因此我希望它不会编译。

  2. 鉴于 (2) 编译,为什么不 (3) 编译??

【问题讨论】:

  • 您是在询问 Go 设计者的基本原理,还是寻求解释您观察到的行为的权威来源?

标签: go pointers methods


【解决方案1】:

m.parse(myString) 编译是因为(我是repeating myselfcalling 上面的方法等于寻址然后 调用指针上的方法,即(&m).parse(myString)

如果x 是可寻址的并且&x 的方法集包含m,则x.m()(&x).m() 的简写

MyObj{}.parse(myString) 无法编译,因为文字 MyObj{} 不可寻址。来自specs: "Address operators"

操作数必须是可寻址的,即变量、指针间接或切片索引操作; [...或其他不适用的情况]

MyObj{}composite literal 两者都不是;而示例 (2) 中的 m 是 - 因为它是一个变量。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
相关资源
最近更新 更多