ZetCode

Go 结构体标签

最后修改时间 2024 年 4 月 11 日

在本文中,我们将展示如何在 Golang 中使用结构体标签。

一个 结构体 是一个用户定义的类型,它包含一组字段。它用于将相关数据组合成一个单一的单元。Go 结构体可以与轻量级的类进行比较,但没有继承特性。

结构体标签是插入到结构体字段中的附加元数据信息。元数据可以通过反射获取。结构体标签通常提供有关结构体字段如何编码或解码为某种格式的说明。

结构体标签在流行的包中使用,包括

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 中的结构体标签。

作者

我叫 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。到目前为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Go 教程