前言
Go语言的反射学习笔记
定义结构体
1 2 3 4 5 6 7
| type 类名 struct { 属性名 数据类型 }
func main() { 对象名 := 类名{属性名: 值} }
|
引入包
获取数据的类型对象
<obj>
:被反射的数据
1 2 3
| func main() { var t = reflect.TypeOf(<obj>) }
|
如果数据是结构体
获取结构体字段总数
1 2 3
| func main() { var num = reflect.TypeOf(<obj>).NumField() }
|
获取结构体变量的值
通过下标获取
<index>
:字段在结构体中的下标
1 2 3
| func main() { var value = reflect.ValueOf(<obj>).Field(<index>) }
|
嵌套下标
一层
<field_index>
:字段下标
1 2 3 4 5 6 7
| type User struct { Name string }
func main() { var value = reflect.ValueOf(<obj>).FieldByIndex([]int{<field_index>}) }
|
多层
<field_index_1>
:第一层字段下标
<field_index_1>
:第二层字段下标
1 2 3 4 5 6 7 8 9 10 11 12
| type U struct { Name string }
type User struct { Name string U }
func main() { var value = reflect.ValueOf(<obj>).FieldByIndex([]int{<field_index_1>, <field_index>_2}) }
|
通过字段名获取
<field_name>
:字段名
1 2 3 4 5 6 7
| type User struct { Name string }
func main() { var value = reflect.ValueOf(<obj>).FieldByName("<field_name>") }
|
获取数据的类别
1 2 3
| func main() { var k = reflect.TypeOf(<obj>).Kind() }
|
判断类别
1 2 3 4 5 6 7 8 9 10 11
| func main() { var k = reflect.TypeOf(<obj>).Kind() switch k { case reflect.Struct: ... case reflect.String: ... case reflect.Int: ... } }
|
修改数据
修改字符串数据
<value>
:修改后的值
1 2 3
| func main() { reflect.ValueOf(<obj>).Elem().SetString("<value>") }
|
修改结构体数据
1 2 3
| func main() { reflect.ValueOf(<obj>).Elem().Field(<field_index>).SetString("<value>") }
|
执行结构体数据的函数
Method()
1
| reflect.ValueOf(<obj>).Method(<method_index>).Call()
|
传递参数
<arg>
:传递参数
1
| reflect.ValueOf(<obj>).Method(<method_index>).Call(reflect.ValueOf("<arg>"))
|
获取
完成
参考文献
间书——张朝阳
CSDN——ProblemTerminator
CSDN——灬点点
哔哩哔哩——尚硅谷
CSDN——go圈里最会写js的奇淼