结构体标签
结构体标签的作用是:为了其他包导入调用该包时,可以通过结构体标签来说明该包中的属性的说明,例如该怎么用,或者调用时有什么要求。
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)
}
运行结果:
可以看到通过反射,成功获得到结构体中的结构体标签。
结构体标签在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相关的信息进行转换。
运行结果:
可以看到,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字符串进行解码
运行结果:
可以看到成功利用encoding/json中的Unmarshal来将json字符串解码。
结构体标签的作用总结
- 通过反单引号来声明结构体标签,如
json:"title"
如何获取结构体中的结构体标签?
- 使用reflect.TypeOf(str).Elem()来获取结构体中的元素
- 接着读取元素中的标签:
t.Field(i).Tag.Get("info")
结构体标签的使用场景
- json编码解码
- orm映射关系
此处评论已关闭