为了账号安全,请及时绑定邮箱和手机立即绑定

指向范围覆盖地图或界面切片的循环变量的指针{}

指向范围覆盖地图或界面切片的循环变量的指针{}

Go
蛊毒传说 2021-12-20 10:05:58
我正在使用go-hdf5并且在尝试从地图循环写入属性时遇到问题。属性创建正确(正确的名称和数据类型)但写入的值是垃圾。循环外的相同代码工作正常。我尝试了v := v成语并将代码包装在闭包中以进行捕获,v但没有任何区别。这是代码的要点(为了清楚起见,故意省略了错误检查):m := map[string]interface{"foo", 42}for k, v := range m {    // [...]    v := v    attr.Write(&v, dtype)}该Write方法使用反射来获取指向该值的指针并将其转发到 C 库。代码的相关部分只是:func (s *Attribute) Write(data interface{}, dtype *Datatype) error {    v := reflect.ValueOf(data)    addr := unsafe.Pointer(v.Pointer())    return h5err(C.H5Awrite(s.id, dtype.id, addr))}如果我用一片替换地图interface{},我会遇到完全相同的问题,所以我的直觉是这与循环变量的绑定有关,但v := v没有帮助,所以我不确定。我对 Go、HDF5(C 库)和 go-hdf5 非常熟悉,但我真的被困在这里。任何的想法?顺便说一句,我正在使用 go1.5.1 darwin/amd64。
查看完整描述

1 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

该Write方法需要一个指向值的指针,而不是指向包含该值的接口的指针。您可以使用反射来获取它:


u := reflect.New(reflect.ValueOf(v).Type())

u.Elem().Set(reflect.ValueOf(v))

v := u.Interface()


查看完整回答
反对 回复 2021-12-20
  • 1 回答
  • 0 关注
  • 120 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信