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 を使用しています。