为什么reflect.MakeSlice返回不可寻址的值
在Go中,reflect包提供了一个接口来检查和操作类型和值。 Reflect.MakeSlice 创建给定类型的切片。但是,返回值是不可寻址的。这意味着您无法获取其地址或将其分配给指针。
解决方案:使用reflect.New()
要使用反射获取可寻址切片,您可以使用reflect.New()函数创建指向切片的指针。这可以按如下方式完成:
// Create the slice type sliceType := reflect.SliceOf(SomeType) // Create a slice using reflect.MakeSlice slice := reflect.MakeSlice(sliceType, 10, 10) // Create a pointer to the slice slicePtr := reflect.New(slice.Type()) // Set the slice pointer to the slice slicePtr.Elem().Set(slice)
现在,您有一个可寻址切片,可以将其作为参数传递给需要切片指针的函数。
为什么反射。 MakeSlice 返回不可寻址的值
Go 中的本地堆栈变量是不可寻址的,因为运行时可能会将它们移动到随时堆。 Reflect.MakeSlice 创建一个本地切片变量,这就是为什么返回值是不可寻址的。
为什么需要指向切片的指针
一些 API,例如正如您在 mgo 包中提到的那样,需要一个指向切片的指针作为参数。这是因为当追加到切片时,可能会分配容量增加的新切片。如果传递非指针切片,则对切片所做的更改在函数外部将不可见。
以上是为什么'reflect.MakeSlice”函数返回不可寻址的值?的详细内容。更多信息请关注PHP中文网其他相关文章!