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