Go语言结构体Tag

Go语言结构体Tag教程

Golang 中可以为 结构体 的字段添加 Tag,Golang 本身的 encoding/json 包解析 Json 使用了 Tag,一些开源的ORM 框架,也广泛使用了 Tag。

Golang 中定义结构体的 Tag,使用 ``,在解析 Json 时,可以通过 Tag 指定解析成 Json 字符串之后使用的字段名。

Go语言结构体Tag

定义

type User struct { Name string `tag` Passwd string `tag` }

说明

我们使用 `` 符号定义结构体的 tag。

案例

Go语言结构体Tag

将结构体转成 json 时,指定 tag

package main import ( "encoding/json" "fmt" ) type Person struct { PName string `json:"Name"` PAge int `json:"Age"` } func main() { fmt.Println("嗨客网(www.haicoder.net)") //将结构体转成 json 时,指定 tag jsonStr := `{"Name":"HaiCoder","Age":18}` var p Person if err := json.Unmarshal([]byte(jsonStr), &p); err != nil{ fmt.Println("Error =", err) return } fmt.Println("Person =", p) }

程序运行后,控制台输出如下:

35_golang结构体Tag.png

我们定义了一个结构体 Person,该结构体定义有两个字段,一个是 string 类型的 PName,一个是 int 类型的 PAge。

同时,我们为结构体的字段 PName 设置了 Tag 为 json:"Name" ,为字段 PAge 设置 Tag 为 json:"Age"

因为,我们设置了 Tag,因此将 Json 串转成结构体时,会使用结构体中的 Tag 来匹配 Json 串中的 key,并将对应的字段解析到结构体中。

Go语言结构体Tag

将 json 转成结构体

package main import ( "encoding/json" "fmt" ) type Person struct { PName string `json:"Name"` PAge int `json:"Age"` } func main() { fmt.Println("嗨客网(www.haicoder.net)") //使用Go语言结构体 tag,将 json 转成结构体 person := &Person{ PName:"HaiCoder", PAge :18, } if jsonStr, err := json.Marshal(person); err != nil{ fmt.Println("Err =", err) }else{ fmt.Println("JsonStr =", string(jsonStr)) } }

程序运行后,控制台输出如下:

36_golang结构体Tag.png

我们定义了一个结构体 Person,并为结构体 Person 的字段 PName 设置 Tag 为 json:"Name", Person 的字段 PAge 设置 Tag 为 json:"Age"

因此,最后,我们将结构体转成 Json 串时,Json 串中的 key 是我们结构体中 Tag 指定的 key,而不是结构体的字段名。

Go语言结构体Tag解析json

使用结构体中的 tag,解析成 json 时,可以忽略字段

package main import ( "encoding/json" "fmt" ) type Person struct { PName string `json:"Name"` PAge int `json:"Age"` } func main() { fmt.Println("嗨客网(www.haicoder.net)") //使用结构体中的 tag,解析成json时,可以忽略字段 jsonStr := `{"Web":"haicoder.net", "Name":"HaiCoder","Age":18, "Score":99.1}` var p Person if err := json.Unmarshal([]byte(jsonStr), &p); err != nil{ fmt.Println("Error =", err) return } fmt.Println("Person =", p) }

程序运行后,控制台输出如下:

37_golang结构体Tag.png

我们定义的结构体只有两个字段,但是 json 串中有四个 key,因此,我们解析成结构体时,会自动忽略 json 串中在结构体中不存在 key。

Golang结构体Tag使用总结

Golang 中可以为结构体的字段添加 Tag,Golang 本身的 encoding/json 包解析 Json 使用了 Tag,一些开源的ORM 框架,也广泛使用了 Tag。

Golang 中定义结构体的 Tag,使用 ``,在解析 Json 时,可以通过 Tag 指定解析成 Json 字符串之后使用的字段名。Go 语言结构体 Tag 语法:

type User struct { Name string `tag` Passwd string `tag` }