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