這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
一、StructTag介紹
StructTag是go語言結構體中的一個標記欄位,放在欄位聲明的後面,一般只有特定情況下會用到,如json的轉化。
使用的時候只要把標記的欄位用兩個包起來即可,標籤內的文法形式通常為
key:”value”` ,多個標記用空格隔開。
1 2 3 4
|
type tagTest struct { tagA string `TagA` tagB int `TagB` }
|
二、Struct轉Json
要想把struct轉化成json,只要把結構體內的欄位名設定成匯出狀態,也就是把首字母大寫就行了,預設情況下,轉化後的json中的key值和結構體中的欄位名是一樣的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
package main import ( "fmt" "encoding/json" ) type addr struct { Province string City string } type stu struct { Name string Age int Addr addr } func main(){ var xm = stu{Name:"xiaoming", Age:18, Addr:addr{Province:"Hunan",City:"ChangSha"}} js, err := json.Marshal(xm) if err != nil{ fmt.Println(err) return } fmt.Println(string(js)) //輸出{"Name":"xiaoming","Age":18,"Addr":{"Province":"Hunan","City":"ChangSha"}} }
|
三、Json轉struct
而在把json轉化成struct的時候,要求json和結構體的欄位一致才能被成功轉化,否則轉化後的資料就可能和我們想的不一樣。
要注意的是這裡可以忽略大小寫。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
package main import ( "fmt" "encoding/json" ) type addr struct { Province string City string } type stu struct { Name string Age int Addr addr } func main(){ js := `{"Age":18,"name":"xiaoming","Addr":{"Province":"Hunan","City":"ChangSha"}}` //name是小寫 var xm stu err := json.Unmarshal([]byte(js), &xm) if err != nil{ fmt.Println(err) return } fmt.Println(xm) //輸出{xiaoming 18 {Hunan ChangSha}} }
|
四、使用tag
以上都沒有tag就能相互轉化,說起來好像tag並沒有什麼用!事實的確也就是這樣,tag其實在這裡並不是必需的。
但如果我們期望轉化後的json欄位名和struct裡的不一樣的話,就得用到tag了。
tag在這裡的用途就是提供別名,讓兩者的轉化更加靈活。
tag的使用格式為json:"***"
、‘(***我們期望json轉化過後的名字)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
package main import ( "fmt" "encoding/json" ) type addr struct { Province string `json:"province"` //轉化後對應欄位的json名為province City string `json:"city"` } type stu struct { Name string `json:"name"` Age int `json:"age"` Addr addr `json:"addr"` } func main(){ var xm = stu{Name: "xiaoming", Age: 18, Addr:addr{Province:"Hunan",City:"ChangSha"}} js, err := json.Marshal(xm) if err != nil{ fmt.Println(err) return } fmt.Println(string(js)) var xxm stu err = json.Unmarshal(js, & xxm) fmt.Println(xxm) }
|
輸出:
1 2
|
{"name":"xiaoming","age":18,"addr":{"province":"Hunan","city":"ChangSha"}}//轉化的時候會按照我們指定的名字來轉 {xiaoming 18 {Hunan ChangSha}}//反過來也是一樣
|