在 Go 中,可寻址性是指能够获取变量的内存地址并保证其有效性的能力。局部堆栈变量是不可寻址的,这个概念适用于使用reflect.MakeSlice创建的值。
当使用reflect.MakeSlice时,您创建一个新的切片值。然而,该值不存储在具有已知地址的存储位置中。相反,它暂时存在于堆栈中。这个堆栈分配的值不能用于创建指向切片的指针,因为当堆栈帧被销毁时,该地址将变得无效。
要解决此问题,请执行以下操作:获取可寻址的切片值,可以使用reflect.New()。此函数创建一个指向切片的指针:
myType := reflect.TypeOf(my) slice := reflect.MakeSlice(reflect.SliceOf(myType), 10, 10) x := reflect.New(slice.Type()).Elem() x.Set(slice)
x.Elem() 调用取消引用指针并返回实际的切片值,该值现在可用于传递给 All() 方法。
根据 Go 语言规范,如果满足以下条件,则值是可寻址的:
对于reflect.MakeSlice,新创建的slice 不满足任何这些条件,因为它存在于堆栈上并且不存储在永久内存位置中。
以上是为什么使用“reflect.MakeSlice”创建的切片不可寻址?的详细内容。更多信息请关注PHP中文网其他相关文章!