一、 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 24 25 26 27 |
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 25 26 27 28 29 |
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 27 28 29 30 31 32 |
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}}//反过来也是一样 |
评论