reflect
パッケージを使用して構造体フィールドを操作するのに大まかな時間がかかります。特に、フィールド値の設定方法を理解していません。
タイプt構造体{fi int; fs string} var rt = t {123、 "jblow"} var i64 int64 = 456
フィールド名iを取得-これは動作するようです
var field = reflect.TypeOf(r).Field(i).Name
フィールドiの値をa)インターフェイス{}、b)intとして取得-これは機能するようです
var iface interface{} = reflect.ValueOf(r).Field(i).Interface()
var i int = int(reflect.ValueOf(r).Field(i).Int())
フィールドiの値の設定-1つ試す-パニック
reflect.ValueOf(r).Field(i).SetInt( i64 )
panic:エクスポートされていないフィールドを使用して取得した値を使用するreflect.Value・SetInt
フィールド名「id」と「name」が好きではなかったので、「Id」と「Name」に名前が変更されました
a)この仮定は正しいですか?
b)正しい場合、同じファイル/パッケージ内にあるため必要ではないと考えた
フィールドiの値を設定-2つ試す(フィールド名を大文字にして)-パニック
reflect.ValueOf(r).Field(i).SetInt( 465 )
reflect.ValueOf(r).Field(i).SetInt( i64 )
panic:reflect.Value・アドレス指定不可能な値を使用したSetInt
@peterSOによる以下の指示は、徹底的で高品質です
四。これは機能します:
reflect.ValueOf(&r).Elem().Field(i).SetInt( i64 )
彼はまた、フィールド名がエクスポート可能である必要があることを文書化します(先頭は大文字)
reflect
データの設定に使用している人に最も近い例は、comments.gmane.org /json.Unmarshal