Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > go语言结构体tag

go语言中结构体tag使用小结

作者:晓风残月一望关河萧索

Go语言是一种静态类型、编译型的编程语言,其中结构体是一种非常重要的数据类型,本文就来介绍一下go语言中结构体tag使用,具有一定的参考价值,感兴趣的可以了解一下

go中的tag在结构体中使用的。有两个作用:

(1)给结构体属性起别名,对于不同类型的类型对应不同的值,比如xml,yaml,json等分别对应着不同的区域,当然标签也不同。比如json,bson,都是约定俗成的了。

(2)做属性判断和验证。

1.tag中的格式

(1)tag本身是一个字符串,字符串整个使用反引号``。

(2)key必须是非空字符串,不能使用双引号。字符串不能包含控制字符,空格,引号,冒号。

(3)value以双引号标记的字符串

(4)多个标签之间使用空格连接,标签名不需要使用双引号,标签名对应的值需要使用双引号,多个标签值需要使用逗号连接。

举例:

type User struct {
	UserId   int    `json:"user_id" bson:"b_user_id,bson_id"`
	UserName string `json:"user_name" bson:"b_user_name"`
}

注意:冒号前后不能有空格。

比如以下几个就是约定俗成的标签:bson,json,yaml,xml等,当然这个标签是可以自定义的

2.举例

其实自己也可以想例子,以下案例作参考。

type Student struct {
	// 返回给前端的话,首字母大写很奇怪,所以给Name起了个别名
	Name string `json:"name"`
	Age  int    
}
func testTag() {
	s1 := Student{
		Name: "s1k",
	}
	bytes, err := json.Marshal(s1)
	if err != nil {
		panic(err)
	}
	// 将[]byte数组转换为string类型json类型
	//s := string(bytes)
	var s Student
	json.Unmarshal(bytes, &s)
	fmt.Printf("%v", s)
}
type User struct {
	UserId   int    `json:"user_id" bson:"b_user_id"`
	UserName string `json:"user_name" bson:"b_user_name"`
}
func testJson() {
	u := &User{
		UserId:   1,
		UserName: "tony",
	}
	fmt.Printf("%T", u)
	bytes, _ := json.Marshal(u)
	fmt.Println(string(bytes))
	// 通过反射获取标签的值
	// reflect.TypeOf(u),获取的是指针类型
	types := reflect.TypeOf(u)
	field := types.Elem().Field(0)
	fmt.Println(field.Tag.Get("json"))
	fmt.Println(field.Tag.Get("bson"))
}
type Http struct {
	Port   string `yaml:"port"`
	Secret string `yaml:"secretKey"`
	Domain string `yaml:"domain"`
}
type Config struct {
	Http `yaml:"http"`
}
func testYaml() {
	//var h Http
	config := new(Config)
	file, err := ioutil.ReadFile("config.yaml")
	if err != nil {
		fmt.Println(err.Error())
	}
	// 将解析后的数据存储到结构体中
	err = yaml.Unmarshal(file, config)
	if err != nil {
		fmt.Println(err.Error())
	}
	fmt.Println(config.Http, " ", config.Port, " ", config.Secret, " ", config.Domain)
}
type Person struct {
	Name string `json:"name"`
	Age  string `json:"age,omitempty"` //有 omitempty 属性,因此 encoding/json 在将对象转化 json 字符串时,
	// 只要发现对象里的 Addr 为 false, 0, 空指针,空接口,空数组,空切片,空映射,空字符串中的一种,就会被忽略。
}
func testTags() {
	p1 := &Person{
		Name: "zhangsan",
	}
	// 所以空字符串就会被忽略
	bytes, _ := json.Marshal(p1)
	fmt.Printf("%s", bytes)
	fmt.Println(p1)
	fmt.Printf("%T", p1)
	p2 := &Person{
		Name: "lisi",
		Age:  "15",
	}
	fmt.Println(p2)
}
// 从结构体中取出tag,通过反射
/*
获取字段 field
获取标签 tag
获取键值对 key:value
// 三种获取 field
field := reflect.TypeOf(obj).FieldByName("Name")
field := reflect.ValueOf(obj).Type().Field(i)  // i 表示第几个字段
field := reflect.ValueOf(&obj).Elem().Type().Field(i)  // i 表示第几个字段
// 获取 Tag
tag := field.Tag
// 获取键值对
labelValue := tag.Get("label")
labelValue,ok := tag.Lookup("label")
*/
func getTag() {
	p2 := &Person{
		Name: "lisi",
		Age:  "15",
	}
	// 三种方式获取Field
	field := reflect.ValueOf(p2).Elem().Type().Field(1)
	getName := field.Tag.Get("json")
	// 获取tag
	//value, ok := tag.Lookup("name")
	fmt.Println(getName)
}

到此这篇关于go语言中结构体tag使用小结的文章就介绍到这了,更多相关go语言结构体tag内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文