”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么“reflect.MakeSlice”函数返回不可寻址的值?

为什么“reflect.MakeSlice”函数返回不可寻址的值?

发布于2024-11-10
浏览:761

Why is the `reflect.MakeSlice` Function Returning an Un-Addressable Value?

为什么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