Golang中map转结构体的不同方法
使用第三方模块mapstructure
go get github.com/mitchellh/mapstructure
~~~
带下划线的字段需要特殊处理一下❗️❗️❗️
// 对于带 下划线命名 的变量,需要特殊方法解析 type CurrUser struct { Name string `json:"name"` PhoneNumber string `json:"phone_number"` Hobbies []string `json:"hobbies"` ABC string `json:"a_b_c"` } func TestRangeMap3(t *testing.T) { m1 := map[string]interface{}{ "name": "whw", "phone_number": "13333333333", // TODO 将字段设置为 phonenumber 就可以解析了!!! "hobbies": []string{"football", "basketball"}, "a_b_c": "whw666", } u1 := CurrUser{} dec, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{ TagName: "json", Result: &u1, }) if err != nil { panic(err) } // dec.Decode方法... err = dec.Decode(m1) if err != nil { panic(err) } fmt.Println("name>>> ", u1.Name) // whw fmt.Println("phone_number>>> ", u1.PhoneNumber) // 13333333333 fmt.Println("hobbies>>> ", u1.Hobbies) // [football basketball] fmt.Println("a_b_c>>> ", u1.ABC) // whw666 }
~~~
带下划线的字段普通方法解不出来
package scripts_stroage import ( "encoding/json" "fmt" "github.com/mitchellh/mapstructure" "testing" ) type User struct { Name string `json:"name"` PhoneNumber string `json:"phone_number"` Hobbies []string `json:"hobbies"` } // 对于带 下划线命名 的变量,不能直接解析到 func TestRangeMap1(t *testing.T) { m1 := map[string]interface{}{ "name": "whw", "phone_number": "13333333333", // TODO 将字段设置为 phonenumber 就可以解析了!!! "hobbies": []string{"football", "basketball"}, } u1 := User{} // mapstructure.Decode方法...没有办法解析带下划线的字段~ err := mapstructure.Decode(m1, &u1) if err != nil { panic(err) } fmt.Println("name>>> ", u1.Name) // whw fmt.Println("phone_number>>> ", u1.PhoneNumber) // (空,没有解析到) fmt.Println("hobbies>>> ", u1.Hobbies) // [football basketball] } // 对于带 下划线命名 的变量,需要json序列化与反序列化操作 func TestMap2Struct2(t *testing.T) { m2 := map[string]interface{}{ "name": "whw2", "phone_number": "13333333333", "hobbies": []string{"football", "basketball"}, } u2 := User{} // 序列化 arr, err := json.Marshal(m2) if err != nil { panic(err) } // 反序列化 err2 := json.Unmarshal(arr, &u2) if err2 != nil { panic(err2) } fmt.Println("name>>> ", u2.Name) // whw2 fmt.Println("phone_number>>> ", u2.PhoneNumber) // 13333333333 fmt.Println("hobbies>>> ", u2.Hobbies) // [football basketball] }
外链
https://blog.csdn.net/qq_34326321/article/details/105123996
https://pkg.go.dev/github.com/mitchellh/mapstructure#section-readme