【笔记】Go语言的反射

前言

Go语言的反射学习笔记

定义结构体

1
2
3
4
5
6
7
type 类名 struct {
属性名 数据类型
}

func main() {
对象名 := 类名{属性名: 值}
}

引入包

1
import "reflect"

获取数据的类型对象

<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的奇淼