在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
}
我理解它们之间的区别.第一个函数返回 struct 的副本,第二个函数返回指向函数中创建的 struct 值的指针,第三个函数期望传入现有 struct 并重写该值.
我已经看到所有这些模式都在不同的上下文中使用,我想知道关于这些模式的最佳实践是什么.你什么时候用哪一种?例如,第一个可能适用于小 struct (因为开销最小),第二个适用于较大的 struct .第三种是如果您想要极高的内存效率,因为您可以很容易地在调用之间重用单个 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} }
}
再问一遍:这里有哪些最佳实践.我知道切片总是指针,所以返回指向切片的指针是没有用的.但是,我是否应该返回一段 struct 值、一段指向 struct 的指针,是否应该将指向一段的指针作为参数传递(Go App Engine API中使用的模式)?