为什么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 包中提到的那样,需要一个指向切片的指针作为参数。这是因为当追加到切片时,可能会分配容量增加的新切片。如果传递非指针切片,则对切片所做的更改在函数外部将不可见。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3