Pointers 我应该用指向结构的指针定义func还是只在结构上定义func?

Pointers 我应该用指向结构的指针定义func还是只在结构上定义func?,pointers,go,function-pointers,Pointers,Go,Function Pointers,在围棋中,我似乎有两个选择: foo := Thing{} foo.bar() foo := &Thing{} foo.bar() func (self Thing) bar() { } func (self *Thing) bar() { } 用self Thing或self*Thing定义函数的更好方法是什么 编辑:这不是关于方法和函数的问题的重复。这个问题与事物和事物有关,我认为它的不同足以证明它是自己的url。没有明确的答案,但它们完全不同。如果不使用指针,则“按值传递

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

foo := Thing{}
foo.bar()

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


func (self Thing) bar() {
}

func (self *Thing) bar() {
}
用self Thing或self*Thing定义函数的更好方法是什么


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

没有明确的答案,但它们完全不同。如果不使用指针,则“按值传递”,这意味着调用它的对象将是不可变的(修改副本),如果使用“按引用传递”的指针。我想说的是,你经常使用指针变化,但它完全是情境性的,没有“更好的方法”


如果您查看各种编程框架/类库,您将看到许多示例,其中作者故意选择按值或引用进行操作。例如,在C#.NET中,这是结构和类之间的根本区别,像
Guid
DateTime
这样的类型被故意实现为结构(值类型)。同样,我认为指针通常是更好的选择(如果你浏览.NET,几乎所有的东西都是一个类,引用类型),但它肯定取决于你希望用该类型实现什么和/或你希望消费者/其他开发人员如何与它交互。你可能需要考虑性能和并发性(也许你希望所有的东西都是按价值的,这样你就不用担心一个类型的并发操作,也许你需要一个指针,因为对象内存占用很大,复制它会使程序变得太慢或消耗)。 对于不习惯使用指针的程序员来说 这两个例子可能会让人困惑,但实际情况却是如此 很简单。在类型上定义方法时 上面的示例)的行为与 方法是否将接收器定义为值或指针是不确定的 同样的问题,比如函数参数是否应该是 值或指针。有几个考虑因素

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

顺便说一下,指针接收器与Java中的情况相同, 尽管在Java中,指针隐藏在盖子下面;它是去的 不寻常的价值接受者

二是效率的考虑。如果接收器较大,则为 例如,使用指针会便宜得多 接受者

其次是一致性。如果该类型的某些方法必须具有 指针接收器,其余的也应该是,因此方法集是 无论类型如何使用,都是一致的。请参阅上的一节 方法集以获取详细信息

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

关于一些相关问题的会谈可能重复。