我在路由器處理程序中有這段代碼 decoder := json.NewDecoder(r.Body) var t person.Model err := decoder.Decode(&t). // t is a struct value item, ok := v.People[params["id"]]. // ok is a struct value if t.Handle != "" { item.Handle = t.Handle } if t.Work != "" { item.Work = t.Work } if t.Image != "" { item.Image = t.Image } if t.Firstname != "" { item.Firstname = t.Firstname } if t.Lastname != "" { item.Lastname = t.Lastname } if t.Email != "" { item.Email = t.Email }但我想讓它變得動態(tài),像這樣:["Handle", "Work", "Image", "Firstname", "Lastname", "Email"].forEach(v => { if t[v] != "" { item[v] = t[v] }});這對 Golang 來說有可能嗎?
1 回答

萬千封印
TA貢獻1891條經(jīng)驗 獲得超3個贊
為此使用反射包:
func setFields(dst, src interface{}, names ...string) {
? ? d := reflect.ValueOf(dst).Elem()
? ? s := reflect.ValueOf(src).Elem()
? ? for _, name := range names {
? ? ? ? df := d.FieldByName(name)
? ? ? ? sf := s.FieldByName(name)
? ? ? ? switch sf.Kind() {
? ? ? ? case reflect.String:
? ? ? ? ? ? if v := sf.String(); v != "" {
? ? ? ? ? ? ? ? df.SetString(v)
? ? ? ? ? ? }
? ? ? ? ? ? // handle other kinds
? ? ? ? }
? ? }
}
使用指向值的指針調(diào)用它:
setFields(&item, &t, "FirstName", "LastName", "Email", "Handle")
如果您的實際目標是僅覆蓋 JSON 中存在的字段,那么就這樣做:
item,?ok?:=?v.People[params["id"]].? decoder?:=?json.NewDecoder(r.Body) err?:=?decoder.Decode(&item)
- 1 回答
- 0 關(guān)注
- 181 瀏覽
添加回答
舉報
0/150
提交
取消