在Go中,使用reflect.MakeSlice创建切片会返回一个不可寻址的值。当需要切片地址时,这会成为一个问题,如以下代码片段所示:
collection.Find(bson.M{}).All(&result)
要解决此问题,有两种方法解决方案:
1.使用reflect.New()
最简单的解决方案是使用reflect.New() 创建一个指针。例如:
my := &My{} // Create a slice to begin with myType := reflect.TypeOf(my) slice := reflect.MakeSlice(reflect.SliceOf(myType), 10, 10) // Create a pointer to a slice value and set it to the slice x := reflect.New(slice.Type()) x.Elem().Set(slice) collection.Find(bson.M{}).All(x.Interface())
2。使用类型化映射
或者,您可以使用类型化映射来创建所需类型的切片:
type MyStructList map[string]*MyStruct myMap := reflect.New(reflect.MapOf(myKey, myValue)) for _, value := range myMap.MapKeys() { myValue := myMap.MapIndex(value) }
本地堆栈变量,包括由reflect.MakeSlice创建的变量,在Go中是不可寻址的。这确保了指向这些变量的指针保持有意义,并且不会指向无效的内存位置。
mgo API 需要一个指向切片的指针作为其 iter .All 函数,因为附加到切片可能会重新分配内存。为了将这些更改传达给调用者,需要一个指针。
以上是为什么 `reflect.MakeSlice` 在 Go 中返回不可寻址的值?的详细内容。更多信息请关注PHP中文网其他相关文章!