最佳答案
在Go中,有多种方法可以返回struct
值或其切片。就我所见过的个体而言:
type MyStruct struct {
Val int
}
func myfunc() MyStruct {
return MyStruct{Val: 1}
}
func myfunc() *MyStruct {
return &MyStruct{}
}
func myfunc(s *MyStruct) {
s.Val = 1
}
我明白它们之间的区别。第一个返回一个结构体的副本,第二个返回一个指向在函数中创建的结构体值的指针,第三个返回传入一个现有的结构体并覆盖该值。
我看到所有这些模式都在不同的环境中使用,我想知道关于这些的最佳实践是什么。什么时候用which?例如,第一种方法适用于小型结构(因为开销最小),第二种方法适用于大型结构。第三种方法用于提高内存效率,因为可以在调用之间轻松重用单个struct实例。什么时候使用哪种有什么最佳实践吗?
同样的,关于切片的问题:
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} }
}
func myfunc(s *[]*MyStruct) {
*s = []MyStruct{ &MyStruct{Val: 1} }
}
再说一遍:这里的最佳实践是什么。我知道片总是指针,所以返回指向片的指针是没有用的。然而,我是否应该返回一个结构值的切片,一个指向结构的指针的切片,是否应该传入一个指向切片的指针作为参数(在Go应用程序引擎API中使用的模式)?