网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事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 {
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!