我们可以通过Tag
来增强结构体的定义,Tag会带上一些meta信息,在本文中我们将通过几个例子来深入了解Tag
的用法。
结构
Struct
是由一组field
组成,每个field
包括了名字(可选)和字段类型
package main
import “fmt”
type T1 struct {
f1 string
}
type T2 struct {
T1
f2 int64
f3, f4 float64
}
func main() {
t := T2{T1{“foo”}, 1, 2, 3}
fmt.Println(t.f1) // foo
fmt.Println(t.T1.f1) // foo
fmt.Println(t.f2) // 1
}
field
T1是一个嵌入型field
, 它并没有字段名 。Field
定义可以像f3
和f4
一样公用一个字段类型。
标签
有时候会在字段定义后面带上一个字符串(tag
)。类似于如下
type T struct {
f1 string “f one”
f2 string
f3 string f three
f4, f5 int64 f four and five
}
不管是raw string
还是interpreted string
都可以用来当tag
。 如果field
定义时候两个名字公用一个属性,那么这个tag
会被附在两个名字上,像f4,f5一样。
反射
Tag
在运行时可以通过reflection
包来读取
package main
import (
“fmt”
“reflect”
)
type T struct {
f1 string “f one”
f2 string
f3 string f three
f4, f5 int64 f four and five
}
func main() {
t := reflect.TypeOf(T{})
f1, _ := t.FieldByName(“f1”)
fmt.Println(f1.Tag) // f one
f4, _ := t.FieldByName(“f4”)
fmt.Println(f4.Tag) // f four and five
f5, _ := t.FieldByName(“f5”)
fmt.Println(f5.Tag) // f four and five
}
设置一个空tag
和不设置tag
的效果一致
type T struct {
f1 string ``
f2 string
}
func main() {
t := reflect.TypeOf(T{})
f1, _ := t.FieldByName(“f1”)
fmt.Printf(“%q\n”, f1.Tag) // “”
f2, _ := t.FieldByName(“f2”)
fmt.Printf(“%q\n”, f2.Tag) // “”
}
格式
Tags
可以由键值对来组成,通过空格符来分割键值 —key1:"value1" key2:"value2" key3:"value3"
。如果Tags格式没问题的话,我们可以通过Lookup
或者Get
来获取键值对的值。
Lookup
回传两个值 —对应的值和是否找到
type T struct {
f string one:"1" two:"2"blank:""
}
func main() {
t := reflect.TypeOf(T{})
f, _ := t.FieldByName(“f”)
fmt.Println(f.Tag) // one:“1” two:“2"blank:”"
v, ok := f.Tag.Lookup(“one”)
fmt.Printf(“%s, %t\n”, v, ok) // 1, true
v, ok = f.Tag.Lookup(“blank”)
fmt.Printf(“%s, %t\n”, v, ok) // , true
v, ok = f.Tag.Lookup(“five”)
fmt.Printf(“%s, %t\n”, v, ok) // , false
}
Get
方法只是简单的包装了以下Lookup
。但是丢弃了是否成功结果
func (tag StructTag) Get(key string) string {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Go语言工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Go语言全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Golang知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Go)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
24b (备注Go)**
[外链图片转存中…(img-IZrMiL1H-1712967447305)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!