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



在go中,我似乎有两个选择:

foo := Thing{}
foo.bar()
foo := &Thing{}
foo.bar()

func (self Thing) bar() {
}
func (self *Thing) bar() {
}
用自我事物

或自我*事物定义我的功能有什么更好的方法?

编辑:这不是关于方法和函数的问题的重复。这个问题与事物和事物有关,我认为它足够不同,可以保证它自己的网址。

从官方FAQ中查看此项目:

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

首先,也是最重要的,该方法是否需要修改 接收器?如果是这样,则接收器必须是指针。(切片和地图 作为参考,所以他们的故事更微妙一些,但 实例,用于更改接收器必须的方法中的切片长度 仍然是一个指针。在上面的例子中,如果指针方法修改 s的字段,调用方将看到这些更改,但值方法是 使用调用方参数的副本调用(这是 传递一个值),因此它所做的更改对调用方是不可见的。

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

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

其次是一致性。如果该类型的某些方法必须具有 指针接收器,其余的也应该如此,因此方法集为 无论类型使用方式如何,都保持一致。请参阅有关 方法集了解详细信息。

对于基本类型、切片和小型结构等类型,值 接收器非常便宜,所以除非方法的语义需要 一个指针,一个值接收器是高效而清晰的。

没有明确的答案,但它们完全不同。当你不使用指针时,你"按值传递",这意味着你调用它的对象将是不可变的(修改副本),当你使用指针时,你"通过引用传递"。我会说你更经常使用指针品种,但它完全是情境性的,没有"更好的方法"。

如果你看一下各种编程框架/类库,你会看到许多作者故意选择通过值或引用来做事的例子。例如,在 C# .NET 中,这是结构体和类之间的根本区别,GuidDateTime 等类型被特意实现为结构(值类型)。同样,我认为指针通常是更好的选择(如果您浏览 .NET 几乎所有内容都是类,引用类型),但这绝对取决于您希望使用该类型实现什么和/或您希望消费者/其他开发人员如何与之交互。您可能需要考虑性能和并发性(也许您希望所有内容都按值进行,这样您就不必担心类型的并发操作,也许您需要一个指针,因为对象内存占用量很大,复制它会使程序太慢或消耗)。

相关内容

  • 没有找到相关文章

最新更新