指向地图上的范围或接口切片的循环变量的指针{}

时间:2016-02-26 17:44:04

标签: go hdf5 unsafe-pointers

我正在使用go-hdf5,并且在尝试从地图中循环编写属性时遇到了问题。

正确创建属性(正确的名称和数据类型),但写入的值是垃圾。

循环外的相同代码工作正常。我尝试了两个v := v习惯用法并将代码包装在一个闭包中以捕获v,但它没有什么区别。

以下是代码的要点(为清晰起见,故意遗漏错误检查):

m := map[string]interface{"foo", 42}
for k, v := range m {
    // [...]
    v := v
    attr.Write(&v, dtype)
}

Write method正在使用反射来获取指向该值的指针并将其转发到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非常熟悉,但我真的被困在这里了。有什么想法吗?

BTW我正在使用go1.5.1 darwin / amd64。

1 个答案:

答案 0 :(得分:0)

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

u := reflect.New(reflect.ValueOf(v).Type())
u.Elem().Set(reflect.ValueOf(v))
v := u.Interface()