Go 结构体标签
最后修改时间 2024 年 4 月 11 日
在本文中,我们将展示如何在 Golang 中使用结构体标签。
一个 结构体 是一个用户定义的类型,它包含一组字段。它用于将相关数据组合成一个单一的单元。Go 结构体可以与轻量级的类进行比较,但没有继承特性。
结构体标签是插入到结构体字段中的附加元数据信息。元数据可以通过反射获取。结构体标签通常提供有关结构体字段如何编码或解码为某种格式的说明。
结构体标签在流行的包中使用,包括
- encoding/json
- encoding/xml
- gopkg.in/mgo.v2/bson
- gorm.io/gorm
- github.com/gocarina/gocsv
- gopkg.in/yaml.v2
Go 结构体标签 json
在下一个示例中,我们将 `json` 结构体标签与 `encoding/json` 包一起使用。
main.go
package main import ( "encoding/json" "fmt" ) type User struct { Id int `json:"id"` Name string `json:"name"` Occupation string `json:"occupation,omitempty"` } func (p User) String() string { return fmt.Sprintf("User id=%v, name=%v, occupation=%v", p.Id, p.Name, p.Occupation) } func main() { user := User{Id: 1, Name: "John Doe", Occupation: "gardener"} res, _ := json.MarshalIndent(user, " ", " ") fmt.Println(string(res)) user2 := User{Id: 1, Name: "John Doe"} res2, _ := json.MarshalIndent(user2, " ", " ") fmt.Println(string(res2)) }
该示例使用结构体标签来配置 JSON 数据的编码方式。
type User struct { Id int `json:"id"` Name string `json:"name"` Occupation string `json:"occupation,omitempty"` }
使用 `json:"id"` 结构体标签,我们将 Id 字段编码为小写。此外,`omitempty` 会在 `Occupation` 字段为空时将其省略。
$ go run main.go { "id": 1, "name": "John Doe", "occupation": "gardener" } { "id": 1, "name": "John Doe" }
Go 结构体标签 xml
在以下示例中,我们将 `xml` 结构体标签与 `encoding/xml` 包一起使用。
main.go
package main import ( "encoding/xml" "fmt" ) type User struct { Id int `xml:"id"` Name string `xml:"name"` Occupation string `xml:"occupation"` } func (p User) String() string { return fmt.Sprintf("User id=%v, name=%v, occupation=%v", p.Id, p.Name, p.Occupation) } func main() { user := User{Id: 1, Name: "John Doe", Occupation: "gardener"} res, _ := xml.MarshalIndent(user, " ", " ") fmt.Println(xml.Header + string(res)) }
该示例将 Go 结构转换为 XML 格式。使用结构体标签,我们可以配置输出。
$ go run main.go <?xml version="1.0" encoding="UTF-8"?> <User> <id>1</id> <name>John Doe</name> <occupation>gardener</occupation> </User>
Go 结构体标签 csv
下一个示例使用 `csv` 结构体标签和 `github.com/gocarina/gocsv` 库。该包提供了易于使用的序列化和反序列化函数,以便在 Golang 中使用 CSV。
main.go
package main import ( "fmt" "github.com/gocarina/gocsv" ) type User struct { Id string `csv:"user_id"` Name string `csv:"user_name"` Occupation string `csv:"user_occupation"` } func (p User) String() string { return fmt.Sprintf("User id=%v, name=%v, occupation=%v", p.Id, p.Name, p.Occupation) } func main() { users := []User{} users = append(users, User{Id: "1", Name: "John Doe", Occupation: "gardener"}) users = append(users, User{Id: "2", Name: "Roger Doe", Occupation: "driver"}) res, _ := gocsv.MarshalString(users) fmt.Println(res) }
我们将用户结构体切片转换为 CSV;结构体标签配置了标题名称。
$ go run main.go user_id,user_name,user_occupation 1,John Doe,gardener 2,Roger Doe,driver
来源
The Go Programming Language Specification
在本文中,我们介绍了 Golang 中的结构体标签。