1. 程式人生 > >golang-利用反射給結構體賦值

golang-利用反射給結構體賦值

cnblogs logs val valueof blog eof 成員 str byname

由於想給一個結構體的部分成員賦值,但是有不知道具體名字,故將tag的json名字作為索引,按照json名字來一一賦值



//將結構體裏的成員按照json名字來賦值
func SetStructFieldByJsonName(ptr interface{}, fields map[string]interface{}) {
    logger.Debug("fields:", fields)

    v := reflect.ValueOf(ptr).Elem() // the struct variable

    for i := 0; i < v.NumField(); i++ {

        fieldInfo :
= v.Type().Field(i) // a reflect.StructField tag := fieldInfo.Tag // a reflect.StructTag name := tag.Get("json") if name == "" { name = strings.ToLower(fieldInfo.Name) } //去掉逗號後面內容 如 `json:"voucher_usage,omitempty"` name = strings.Split(name, "
,")[0] logger.Debug("JSONnAME:", name) if value, ok := fields[name]; ok { logger.Debug("fieldInfo.Name:", fieldInfo.Name) //給結構體賦值 //保證賦值時數據類型一致 logger.Debug("類型1:", reflect.ValueOf(value).Type(), "類型2:", v.FieldByName(fieldInfo.Name).Type())
if reflect.ValueOf(value).Type() == v.FieldByName(fieldInfo.Name).Type() { v.FieldByName(fieldInfo.Name).Set(reflect.ValueOf(value)) } } } return }

 

golang-利用反射給結構體賦值