2 回答

TA贡献1921条经验 获得超9个赞
从官方常见问题解答中查看此项目:
对于不习惯指针的程序员来说,这两个例子之间的区别可能会令人困惑,但情况其实很简单。在类型上定义方法时,接收器(在上面的示例中为 s)的行为就像它是方法的参数一样。将接收者定义为值还是指针是同一个问题,那么,函数参数应该是值还是指针。有几个考虑。
首先,也是最重要的,该方法是否需要修改接收器?如果是,则接收者必须是一个指针。(切片和映射充当引用,所以它们的故事有点微妙,但是例如要更改方法中切片的长度,接收者仍然必须是指针。)在上面的示例中,如果 pointerMethod 修改了s,调用者将看到这些更改,但 valueMethod 是使用调用者参数的副本调用的(这是传递值的定义),因此调用者将看不到它所做的更改。
顺便说一句,指针接收器与 Java 中的情况相同,尽管在 Java 中指针隐藏在幕后;Go 的价值接收者是不寻常的。
二是对效率的考虑。如果接收器很大,例如一个大的结构,使用指针接收器会便宜得多。
接下来是一致性。如果该类型的某些方法必须有指针接收器,其余的也应该如此,因此无论如何使用该类型,方法集都是一致的。有关详细信息,请参阅方法集部分。
对于诸如基本类型、切片和小型结构之类的类型,值接收器非常便宜,因此除非方法的语义需要指针,否则值接收器是高效且清晰的。

TA贡献2012条经验 获得超12个赞
没有明确的答案,但它们完全不同。当您不使用指针时,您“按值传递”意味着您调用它的对象将是不可变的(修改副本),当您使用指针时,您“按引用传递”。我会说你更经常使用指针种类,但它完全取决于情况,没有“更好的方法”。
如果您查看各种编程框架/类库,您会看到许多示例,其中作者故意选择按值或引用来做事。例如,在 C# .NET 中,这是结构和类以及类似Guid
和DateTime
被故意实现为结构(值类型)。同样,我认为指针通常是更好的选择(如果你通过 .NET 看几乎所有东西都是一个类,引用类型),但这绝对取决于你希望通过类型实现什么和/或你想要消费者的方式/other 开发人员与之交互。您可能需要考虑性能和并发性(也许您希望一切都按值计算,这样您就不必担心类型的并发操作,也许您需要一个指针,因为对象内存占用量很大,复制它会使您的程序太慢或耗电)。
- 2 回答
- 0 关注
- 186 浏览
添加回答
举报