Golang中map转结构体的不同方法


使用第三方模块mapstructure

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]

}

~~~


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM