不灭的火

革命尚未成功,同志仍须努力下载JDK17

作者:AlbertWen  添加时间:2018-04-09 16:09:48  修改时间:2025-05-14 18:10:14  分类:14.Golang/Ruby  编辑

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

 

摘自:https://gocn.io/question/278