在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
}
Run Code Online (Sandbox Code Playgroud)
我理解这些之间的差异.第一个返回结构的副本,第二个返回指向函数内创建的结构值的指针,第三个期望传入现有结构并覆盖该值.
我已经看到所有这些模式都在各种环境中使用,我想知道关于这些模式的最佳实践是什么.你什么时候用哪个?例如,第一个可能适用于小结构(因为开销很小),第二个适用于较大结构.第三个是你想要非常高效的内存,因为你可以在调用之间轻松地重用一个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} }
}
Run Code Online (Sandbox Code Playgroud)
再说一次:这里的最佳做法是什么.我知道切片总是指针,所以返回指向切片的指针是没用的.但是,如果我返回一片struct值,一块指向结构的指针,我应该将指向切片的指针作为参数传入(Go …
fmt.Println(v.Kind())
fmt.Println(reflect.TypeOf(v))
Run Code Online (Sandbox Code Playgroud)
如何找出切片的反射值的类型?
以上结果在
v.Kind = slice
typeof = reflect.Value
Run Code Online (Sandbox Code Playgroud)
当我尝试Set创建错误的切片时它会崩溃
t := reflect.TypeOf([]int{})
s := reflect.MakeSlice(t, 0, 0)
v.Set(s)
Run Code Online (Sandbox Code Playgroud)
例如[]int{},[]string{}在创建之前,我需要知道反射值的确切切片类型,而不是这样。