Golang Go语言中什么时候应该把方法绑定在struct的值上而不是指针上?

发布于 1周前 作者 wuwangju 来自 Go语言

不知道我的理解是不是正确的 https://segmentfault.com/a/1190000006803598

感觉 golang 能把方法绑定在 struct 的值上是一种非常奇怪的设计。既然没有任何明显的好处,为何还要提供给用户呢?
Golang Go语言中什么时候应该把方法绑定在struct的值上而不是指针上?

9 回复

其实你把 struct 当成一个函数的参数就明了了,实际上,也是一个参数,隐含的参数。
函数传参可以传值或者传址,传值的好处是可以使得结构体只读,传址可以改变结构体的成员值。

更多关于Golang Go语言中什么时候应该把方法绑定在struct的值上而不是指针上?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


好问题,暂时想不出为什么…

我都是看老黄历来决定的

不确定就用指针
只有 struct 足够小时(塞得进 L1 )传 struct ,因为指针还要多寻址一次
还有对象不传出函数的话怎么样都行

理解了 immutability 的好处就能理解传值的好处了。

  1. receiver 通常用指针( ref:https://github.com/golang/go/wiki/CodeReviewComments#receiver-type)
    2. Slices, maps, channels, strings, function values, and interface values 实现机制类似指针,所以可以直接传递
    3. 大的结构体和将要修改的结构体用指针。因为指针拷贝代价小,并且可以直接操作对象。

绝大多数情况下,无脑使用指针即可。
一般的情况下,无意中就用值了,比如 type Foo int 的时候。
更少的情况下,不得不使用值的时候,自然会去选择用值。

在Golang中,选择将方法绑定到struct的值上还是指针上,通常取决于方法的用途和对struct实例的修改需求。以下是一些考虑因素,可以帮助你决定何时将方法绑定在struct的值上而不是指针上:

  1. 不可变性:如果方法不需要修改struct的任何字段,那么将其绑定到值上是合理的。这有助于保持数据的不可变性,使得方法调用更加安全。

  2. 性能:对于小型的struct,传递值可能比传递指针的开销更小。然而,对于大型struct或包含大量数据的struct,传递指针通常更为高效,因为它避免了数据的复制。

  3. 方法调用者:如果方法的调用者持有的是struct的值而不是指针,那么将方法绑定到值上可以使调用更加直接和方便。

  4. 一致性:如果struct的其他方法都是绑定到值上的,为了保持一致性,新的方法也应该绑定到值上。这有助于减少混淆和潜在的错误。

  5. 接口实现:如果struct需要实现一个接口,并且该接口的方法签名要求接收者为值类型,那么方法必须绑定到struct的值上。

总的来说,如果方法不需要修改struct的状态,并且struct相对较小或不可变性是一个重要考虑因素,那么将方法绑定到struct的值上是一个合理的选择。然而,在大多数情况下,特别是对于可能修改struct字段的方法,将方法绑定到指针上更为常见和实用。

回到顶部