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

 更新时间:2023年10月08日 14:54:49   作者:晓风残月一望关河萧索  
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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go 并发控制context实现原理剖析(小结)

    Go 并发控制context实现原理剖析(小结)

    Golang context是Golang应用开发常用的并发控制技术,这篇文章主要介绍了Go 并发控制context实现原理剖析(小结),具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • Go依赖注入DI工具wire使用详解(golang常用库包)

    Go依赖注入DI工具wire使用详解(golang常用库包)

    依赖注入是指程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入,本文结合示例代码给大家介绍Go依赖注入DI工具wire使用,感兴趣的朋友一起看看吧
    2022-04-04
  • 详解如何在Golang中监听多个channel

    详解如何在Golang中监听多个channel

    这篇文章主要为大家详细介绍了如何在Golang中实现监听多个channel,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-03-03
  • Go语言JSON解析器gjson使用方法详解

    Go语言JSON解析器gjson使用方法详解

    这篇文章主要介绍了Go语言json解析框架与gjson,JSON 解析是我们不可避免的常见问题,在Go语言中,我们可以借助gjson库来方便的进行json属性的提取与解析,需要的朋友可以参考一下
    2022-12-12
  • 探究gRPC 客户端调用服务端需要连接池吗?

    探究gRPC 客户端调用服务端需要连接池吗?

    这篇文章主要为大家介绍了gRPC 客户端调用服务端需要连接池吗的问题探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Go语言实现登录验证代码案例

    Go语言实现登录验证代码案例

    这篇文章主要介绍了Go语言实现登录验证代码案例,代码和图文讲解的很清晰,有感兴趣的可以学习下
    2021-03-03
  • golang中数组与切片的区别详析

    golang中数组与切片的区别详析

    数组是固定长度,常量,切片长度是可以改变,所以是一个可变的数组,下面这篇文章主要给大家介绍了关于golang中数组与切片区别的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • golang读取yaml配置文件的示例代码

    golang读取yaml配置文件的示例代码

    在项目开发中,经常需要把一些配置文件常量提取到统一配置文件进行维护,go项目在开发中常常把需要维护的常量或者配置提取到yaml文件,所以本文主要来为大家介绍一下golang如何读取yaml配置文件吧
    2023-11-11
  • Golang中的crypto/ecdh包使用详解

    Golang中的crypto/ecdh包使用详解

    这篇文章主要给大家详细介绍了Golang 中的 crypto/ecdh 包,主要包括什么是ECDH 算法和crypto/ecdh 包的使用方法,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • golang标准库time时间包的使用

    golang标准库time时间包的使用

    时间和日期是我们编程中经常会用到的,本文主要介绍了golang标准库time时间包的使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10

最新评论