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

星号引用的方法和 Golang 中没有的方法有什么区别?

星号引用的方法和 Golang 中没有的方法有什么区别?

Go
莫回无 2023-02-06 19:40:03
假设我有一个结构,这个结构有 2 个方法。一个写有星号,另一个没有。这是理解示例的代码。type object struct{    name string    age int}func (obj *object) methodOne{    // do something} func (obj object) methodTwo{    // do something}我知道指针,但仍然不理解这个例子中的概念。
查看完整描述

1 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

正如文档所说:

func (s *MyStruct) pointerMethod() { } // method on pointer
func (s MyStruct)  valueMethod()   { } // method on value

对于不习惯指针的程序员来说,这两个例子之间的区别可能会造成混淆,但情况其实很简单。在类型上定义方法时,接收者(上面示例中的 s)的行为就好像它是方法的参数一样。将接收者定义为一个值还是一个指针是同一个问题,那么,函数参数应该是一个值还是一个指针。有几个考虑因素。

首先,也是最重要的,该方法是否需要修改接收器?如果是,则接收器必须是指针。(切片和映射充当引用,因此它们的故事更微妙一些,但例如要在方法中更改切片的长度,接收者必须仍然是指针。)在上面的示例中,如果 pointerMethod 修改了字段s,调用者将看到这些更改,但是 valueMethod 是用调用者参数的副本调用的(这是传递值的定义),因此它所做的更改对调用者是不可见的。

其次是效率的考虑。如果接收器很大,例如一个大结构,使用指针接收器会便宜得多。

接下来是一致性。如果该类型的一些方法必须有指针接收者,其余的也应该有,所以无论该类型如何使用,方法集都是一致的。有关详细信息,请参阅方法集部分。

对于基本类型、切片和小型结构等类型,值接收器非常便宜,因此除非方法的语义需要指针,否则值接收器是高效且清晰的。


查看完整回答
反对 回复 2023-02-06
  • 1 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

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