GO中的函数设计时候,参数传递选择传递值还是传递指针?

在C++中,函数参数可以这样传递:

func1(Param *p)
func2(Param p)

在Java中,只能使用func1的形式,但是Java中默认使用引用传递。

GO中也是可以使用func1,func2两种形式,在自己设计函数的时候,究竟采用哪种?

看GO标准库中: func Indent(dst *bytes.Buffer, src []byte, prefix, indent string) error

有些参数是指针(bytes),有些是值(indent)。

不知道在设计的时候,有没有什么规范或者约定区遵守,能够使得参数传递更规范一些?

另外GO中,方法集的receiver可以是指针也可以是值,那receiver选择指针还是值呢?

已邀请:

simple - 既要有梦想,又要有实力

赞同来自: cloverstd batmanustc Anthony fangniu

其实我感觉要遵循的原则和C++差不多,有些数据结构比较大,按值传递性能会比较低,还有如果你想要改变入参的值,肯定要传递指针了(slice, map, channel也可当指针处理)。

receiver问题,像C++/Java的receiver都是指针形式(this指针或引用),Go中我觉得大部分时候用指针作为receiver都是OK的,这样也能减少对字段的copy。看看 Go语言圣经上这一节。如果是想防止method改变结构体的值,用值作为receiver可能会比较好,像C++中可以通过const来限制。

另外还有一点需要特别注意,有些数据结构在go语言中是不能做copy的,不然运行时会出问题的,如sync.Mutex, sync.Cond..., 在官网api文档中是有说明的。
如sync.Cond的说明: A Cond must not be copied after first use. 这种数据结构的内部一般有个noCopy的字段,它们的传递就只能用指针了,当然你用值传递也可以编译通过, 可以用go vet工具检查。在C++中可以通过私有化 拷贝构造函数和 复制运算符函数来禁止copy,但go现在没有类似的语法去做强保证。

Mrwxj - 图样图森破

赞同来自:

我写的时候都是使用1,我感觉会少了一次拷贝,作为go开发工程师,我倾向于1

keepeye - 帅到掉渣

赞同来自:

结构体一般用指针,结构体方法接受者也是指针。

要回复问题请先登录注册