มีเวลาคร่าวๆในการทำงานกับฟิลด์โครงสร้างโดยใช้reflect
แพ็คเกจ โดยเฉพาะอย่างยิ่งยังไม่ได้หาวิธีตั้งค่าฟิลด์
พิมพ์ t struct {fi int; fs string} var rt = เสื้อ {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())
การตั้งค่าของฟิลด์ฉัน - ลองหนึ่ง - ตกใจ
reflect.ValueOf(r).Field(i).SetInt( i64 )
ความตื่นตระหนก : reflect.Value · SetInt โดยใช้ค่าที่ได้รับจากฟิลด์ที่ไม่ได้ส่งออก
สมมติว่าไม่ชอบชื่อฟิลด์ "id" และ "name" จึงเปลี่ยนชื่อเป็น "Id" และ "Name"
ก) สมมติฐานนี้ถูกต้องหรือไม่?
b) ถ้าถูกต้องคิดว่าไม่จำเป็นเนื่องจากอยู่ในไฟล์ / แพ็คเกจเดียวกัน
การตั้งค่าของฟิลด์ i - ลองสอง (โดยใช้ชื่อฟิลด์เป็นตัวพิมพ์ใหญ่) - ตกใจ
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/gmane.comp.lang.go.general/35045แต่ถึงอย่างนั้นเขาก็เคยjson.Unmarshal
ทำงานสกปรกจริงๆ