使用reflect
包進行結構字段的處理時間很長。特別是還沒有想出如何設置字段值。使用反射,你如何設置結構字段的值?
type t struct { fi int; fs string } var r t = t{ 123, "jblow" } var i64 int64 = 456
讓現場的名字,我 - 這似乎工作,我場的
var field = reflect.TypeOf(r).Field(i).Name
獲得價值爲)接口{},B)INT - 這似乎工作
var iface interface{} = reflect.ValueOf(r).Field(i).Interface()
var i int = int(reflect.ValueOf(r).Field(i).Int())
場的設定值我 - 一個嘗試 - 恐慌
reflect.ValueOf(r).Field(i).SetInt(i64)
恐慌:使用值獲得使用未導出場
假設它不喜歡的領域reflect.Value·SETINT名稱「id」和「name」,所以改名爲「Id」和「Name」
a)這個假設是否正確?
B)如果正確的話,認爲沒有必要,因爲在同一個文件/封裝領域的
設定值i - 嘗試兩(字段名爲大寫) - 恐慌
reflect.ValueOf(r).Field(i).SetInt(465)
reflect.ValueOf(r).Field(i).SetInt(i64)
panic:reflect.Value·SetInt using unaddressable value
說明低於@peterSO是全面和高品質
四。這個工程:
reflect.ValueOf(&r).Elem().Field(i).SetInt(i64)
他文件,以及該字段名稱必須導出(開頭大寫字母)
我能找到的最接近的例子有人用'reflect'來設置數據是http://comments.gmane.org/gmane.comp.lang.go.general/35045,但即使在那裏,他也使用'json.Unmarshal'來做實際的骯髒工作 –
(the以上評論已過時) –