首页 > 后端开发 > Golang > 为什么 `reflect.MakeSlice` 在 Go 中返回不可寻址的值?

为什么 `reflect.MakeSlice` 在 Go 中返回不可寻址的值?

Patricia Arquette
发布: 2024-11-07 21:56:03
原创
983 人浏览过

Why Does `reflect.MakeSlice` Return an Un-addressable Value in Go?

为什么在Go中reflect.MakeSlice会返回不可寻址的值

问题概述

在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 返回无法寻址的值

本地堆栈变量,包括由reflect.MakeSlice创建的变量,在Go中是不可寻址的。这确保了指向这些变量的指针保持有意义,并且不会指向无效的内存位置。

为什么需要指向切片的指针

mgo API 需要一个指向切片的指针作为其 iter .All 函数,因为附加到切片可能会重新分配内存。为了将这些更改传达给调用者,需要一个指针。

以上是为什么 `reflect.MakeSlice` 在 Go 中返回不可寻址的值?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板