0

我正在使用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。

4

1 回答 1

0

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

u := reflect.New(reflect.ValueOf(v).Type())
u.Elem().Set(reflect.ValueOf(v))
v := u.Interface()
于 2016-02-26T19:47:52.743 回答