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


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

 
         
1.通過tag反射
//
將結構體里的成員按照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 }
 
         

 2.通過結構體字段名稱進行反射

// 通過反射,對user進行賦值
type user struct{
    name string
    age int
    feature map[string]interface{}
}


func main() {
    var u interface{}
    u=new(user)
    value:=reflect.ValueOf(u)
    if value.Kind()==reflect.Ptr{
        elem:=value.Elem()
        name:=elem.FieldByName("name")
        if name.Kind()==reflect.String{
            *(*string)(unsafe.Pointer(name.Addr().Pointer())) = "fangwendong"
        }

        age:=elem.FieldByName("age")
        if age.Kind()==reflect.Int{
            *(*int)(unsafe.Pointer(age.Addr().Pointer())) =24
        }

        feature:=elem.FieldByName("feature")
        if feature.Kind()==reflect.Map{
            *(*map[string]interface{})(unsafe.Pointer(feature.Addr().Pointer())) =map[string]interface{}{
                "愛好":"籃球",
                "體重":60,
                "視力":5.2,
            }
        }

    }

    fmt.Println(u)
}

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM