一句话总结:方便通过tag获取struct的成员变量
为什么要有tag
go语言中命名都是推荐都是用驼峰方式,但是由于实际项目中经常需要和其它的系统进行数据交互,这个时候如果用属性名来作为键值可能不一定会符合项目要求。如代码中对象的结构体的成员变量和数据库表中的列名的映射关系的建立是通过struct Tag来实现的。
如何获取tag
直接上实例吧
package main
import (
"fmt"
"encoding/json"
"reflect"
)
type Person struct {
Name string `name`
Age int `age`
Addr string `China:"beijing"` //beijing一定要有冒号,否则认为是个字符串,不会认为是个map
phone string `phone`
}
func main() {
person := &Person{Name:"simon", Age:22, Addr:"road88"}
jsonData, err := json.Marshal(person) //成员必须大写可见
if err != nil {
panic("json Marshl err")
}
fmt.Println("phone member is invisible.")
fmt.Println(string(jsonData))
reflectType := reflect.TypeOf(person)
field := reflectType.Elem().Field(0)
fmt.Println("field 0 tag:", field.Tag)
field = reflectType.Elem().Field(2)
fmt.Println("field 2 tag:", field.Tag)
fmt.Println("field 2 tag:", field.Tag.Get("China"))
field = reflectType.Elem().Field(3)
fmt.Println("field 3 tag:", field.Tag)
}
运行结果
phone member is invisible.
{“Name”:”simon”,”Age”:22,”Addr”:”road88”}
field 0 tag: name
field 2 tag: China:”beijing”
field 2 tag: beijing
field 3 tag: phone
Process finished with exit code 0