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

我应该使用指向结构的指针还是仅在结构上定义我的函数?

我应该使用指向结构的指针还是仅在结构上定义我的函数?

Go
慕丝7291255 2021-12-20 19:23:26
在 go 中,我似乎有两个选择:foo := Thing{}foo.bar()foo := &Thing{}foo.bar()func (self Thing) bar() {}func (self *Thing) bar() {}用 self Thing 或 self *Thing 定义我的函数的更好方法是什么?编辑:这不是关于方法和函数的问题的重复。这个问题与 Thing 和 &Thing 有关,我认为它的不同足以保证它自己的网址。
查看完整描述

2 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

从官方常见问题解答中查看此项目:

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

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

顺便说一句,指针接收器与 Java 中的情况相同,尽管在 Java 中指针隐藏在幕后;Go 的价值接收者是不寻常的。

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

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

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


查看完整回答
反对 回复 2021-12-20
?
繁花如伊

TA贡献2012条经验 获得超12个赞

没有明确的答案,但它们完全不同。当您不使用指针时,您“按值传递”意味着您调用它的对象将是不可变的(修改副本),当您使用指针时,您“按引用传递”。我会说你更经常使用指针种类,但它完全取决于情况,没有“更好的方法”。

如果您查看各种编程框架/类库,您会看到许多示例,其中作者故意选择按值或引用来做事。例如,在 C# .NET 中,这是结构和类以及类似GuidDateTime被故意实现为结构(值类型)。同样,我认为指针通常是更好的选择(如果你通过 .NET 看几乎所有东西都是一个类,引用类型),但这绝对取决于你希望通过类型实现什么和/或你想要消费者的方式/other 开发人员与之交互。您可能需要考虑性能和并发性(也许您希望一切都按值计算,这样您就不必担心类型的并发操作,也许您需要一个指针,因为对象内存占用量很大,复制它会使您的程序太慢或耗电)。


查看完整回答
反对 回复 2021-12-20
  • 2 回答
  • 0 关注
  • 186 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号