Go里面有很多方式返回一个struct的值或者slice,我们经常会看到的是如下的代码:
type MyStruct struct { Val int } func myfunc() MyStruct { return MyStruct{Val: 1} } func myfunc() *MyStruct { return &MyStruct{} } func myfunc(s *MyStruct) { s.Val = 1 }
我知道这三种方式的不同点,第一个返回一个struct的copy,第二个在函数内部创建一个指向struct的指针然后返回,第三个是传入一个已经存在的struct,然后修改他的值。
我在很多源码里面见过这三种不同的用法,我是想知道这个的最佳实践是什么?什么时候应该用哪一种?例如第一种用在一些小的struct(因为这个花费是最小的),第二种应用在大的struct,而第三种可能就是为了非常的节约内存,因为你在不同的调用中重用struct。
slice的例子也是类似如下:
func myfunc() []MyStruct { return []MyStruct{ MyStruct{Val: 1} } } func myfunc() []*MyStruct { return []MyStruct{ &MyStruct{Val: 1} } } func myfunc(s *[]MyStruct) { *s = []MyStruct{ MyStruct{Val: 1} } }
https://github.com/golang/go/wiki/CodeReviewComments#Receiver_Type