结构体标签

结构体标签的作用是:为了其他包导入调用该包时,可以通过结构体标签来说明该包中的属性的说明,例如该怎么用,或者调用时有什么要求。

golang允许给结构体的属性添加标签,标签格式为键值对格式,标签数量可以是多个。

例如给一个结构体中的属性绑定结构体标签:

package main

type resume struct {
    Name string `info:"name" doc:"我的名字"`
    Sex string `info:"sex"`
}

通过反射解析出当前结构体标签中的属性

通过reflect包可以获得结构体中的属性中的某一个tag结构体标签,如获取resume结构体中的属性中的info结构体标签:

package main

import (
    "fmt"
    "reflect"
)

type resume struct {
    Name string `info:"name" doc:"我的名字"`
    Sex string `info:"sex"`
}

func findTag(str interface{}) {
    t := reflect.TypeOf(str).Elem() // 获得传递过来的结构体的全部元素
    for i := 0; i< t.NumField(); i++ { // 循环结构体中的属性
        tagString := t.Field(i).Tag.Get("info") // 得到当前遍历的属性的键为info的结构体标签。
        fmt.Println("info:", tagString)
    }
}

func main() {
    var re resume
    findTag(&re)
}

运行结果:
image.png
可以看到通过反射,成功获得到结构体中的结构体标签。

下面举一个结构体标签在json中运用的例子

结构体标签在json中运用的例子

结构体->json格式

先声明一个结构体,再将该结构体转换成json格式打印出来。

package main

import (
    "encoding/json" // Go语言自带的JSON转换库
    "fmt"
)

type Movie struct {
    Title string `json:"title"`
    Year int    `json:"year"`
    Price int `json:"rmb"`
    Actors []string `json:"actors"`
}

func main() {
    movie := Movie{"变形金刚", 2010, 20, []string{"演员甲"}}
    // 进行编码,将结构体转换成json
    jsonStr, err := json.Marshal(movie)
    if err != nil {
        fmt.Println("json marshal error", err)
        return
    }

    fmt.Printf("jsonStr = %s\n", jsonStr)
}
  • 8-12行对结构体中的属性添加结构体标签,格式为json: "xxx" 这样可以告诉json转换库,转换时该属性对应的json键名。
  • 18行调用json.Marshal来转换结构体,此时encoding/json会将结构体标签中设置的json相关的信息进行转换。

运行结果:
image.png
可以看到,json数据中的键对应着结构体中设置的结构体标签。

json格式->结构体

接下来尝试将编码之后的json数据再解码成结构体。

package main

import (
    "encoding/json"
    "fmt"
)

type Movie struct {
    Title string `json:"title"`
    Year int    `json:"year"`
    Price int `json:"rmb"`
    Actors []string `json:"actors"`
}

func main() {
    movie := Movie{"变形金刚", 2010, 20, []string{"演员甲"}}
    // 进行编码,将结构体转换成json
    jsonStr, err := json.Marshal(movie)
    if err != nil {
        fmt.Println("json marshal error", err)
        return
    }

    fmt.Printf("jsonStr = %s\n", jsonStr)

    // 解码过程 jsostr -> 结构体
    //jsonStr = {"title":"变形金刚","year":2010,"rmb":20,"actors":["演员甲"]}
    myMovie := Movie{}
    err = json.Unmarshal(jsonStr, &myMovie)
    if err != nil {
        fmt.Println("json unmarshal err", err)
        return
    }
    fmt.Printf("%v\n", myMovie)
}
  • 第29行使用json.Unmarshal()方法来对上面生成的json字符串进行解码

运行结果:
image.png
可以看到成功利用encoding/json中的Unmarshal来将json字符串解码。

结构体标签的作用总结

  1. 通过反单引号来声明结构体标签,如json:"title"
  2. 如何获取结构体中的结构体标签?

    1. 使用reflect.TypeOf(str).Elem()来获取结构体中的元素
    2. 接着读取元素中的标签:t.Field(i).Tag.Get("info")
  3. 结构体标签的使用场景

    1. json编码解码
    2. orm映射关系
最后修改:2024 年 03 月 13 日
如果觉得我的文章对你有用,请随意赞赏