如何在Golang中使用结构标签

Go结构标签教程展示了如何在Golang中使用结构标签。

$ go version
go version go1.18.1 linux/amd64

我们使用Go版本1.18。

struct是包含字段集合的用户定义类型。它用于将相关数据分组以形成一个单元。Go结构可以比作没有继承特性的轻量级类。

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

结构标签用于流行的包,包括:

  • encoding/json
  • encoding/xml
  • gopkg.in/mgo.v2/bson
  • gorm.io/gorm
  • github.com/gocarina/gocsv
  • gopkg.in/yaml.v2

去构造标签json

在下一个示例中,我们将json结构标记与encoding/json包一起使用。

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"
}

去构造标签xml

在下面的示例中,我们将xml结构标记与encoding/xml包一起使用。

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>

去构造标签csv

下一个示例将csv结构标记与github.com/gocarina/gocsv库一起使用。该包提供了easyserialization和deserialization函数以在Golang中使用CSV。

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

在本教程中,我们介绍了Golang中的结构标记。

列出所有Go教程。

赞(0) 打赏

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏