Go最全Golang的Tag语法_golang tag example,成功收获美团、小米Golangoffer

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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 {
v, _ := tag.Lookup(key)
return v
}


### 转化


将结构体的值转化成其他的类型可通过Tag来定义



type T1 struct {
f int json:"foo"
}
type T2 struct {

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值