2016-03-15 87 views
-1

在旅途中我似乎有两个选择:我应该使用指向结构体的指针还是仅在结构体中定义我的funcs?

foo := Thing{} 
foo.bar() 

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


func (self Thing) bar() { 
} 

func (self *Thing) bar() { 
} 

有什么更好的办法来有自的事物或自定义我的funcs中*的事?

编辑:这是不是方法和功能问题的副本。这个问题与Thing和&事情有关,我认为这是不同的足以说明它自己的网址。

+2

可能的重复[函数和方法在Go中有什么区别?](http://stackoverflow.com/questions/8263546/whats-the-difference-of-functions-and-methods-in-go ) – rkmax

+0

[“指针与参数和返回值中的值”](http://stackoverflow.com/questions/23542989/pointers-vs-values-in-parameters-and-return-values/23551970#23551970)谈到一些相关的问题。 – twotwotwo

回答

1

没有明确的答案,但它们完全不同。当您不使用指针时,“按值传递”意味着当您使用“通过引用传递的指针”时,您调用它的对象将是不可变的(修改副本)。我会说更多的时候你会使用指针变体,但它完全是情境化的,没有更好的方法。

如果你看一下不同的编程框架/类库,你会看到那里的作者都有意选择通过值或引用做的事情很多例子。例如,在C#.NET中,这是结构和类之间的根本区别,像GuidDateTime这样的类型被故意实现为结构体(值类型)。再次,我认为指针通常是更好的选择(如果你仔细看看.NET,几乎所有的东西都是一个类,引用类型),但它绝对取决于你希望通过类型和/或你想要消费者/其他开发人员与之交互。你可能需要考虑性能和并发性(也许你希望所有东西都是有价值的,所以你不必担心类型上的并发操作,也许你需要一个指针,因为对象内存占用很大,复制它会使你的程序太慢或消耗)。

2

看看这个项目从the official FAQ

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

首先,也是最重要的,它的方法,需要修改 接收器?如果是这样,接收器必须是一个指针。 (切片和地图 充当引用,所以他们的故事是一个小更微妙的,但对于 例如改变的方法中的片段的长度的接收器必须 仍然是一个指针。)在上述的例子中,如果pointerMethod修改 的S的领域,主叫方会看到这些变化,但valueMethod是 称为呼叫者的参数的副本(这是传递价值的 定义),所以改变它使会无形地调用者。

顺便说,指针接收器是相同的在Java中,虽然 在Java指针盖下隐藏的情况;这是Go的 价值接收器是不寻常的。

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

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

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