通过反射修改结构体的属性和方法
# 6. 通过反射修改结构体的属性和方法
package main
import (
"fmt"
"reflect"
)
// 定义一个结构体:
type Student32 struct {
Name string
Age int
}
// 给结构体绑定方法:
func (s Student32) CPrint() {
fmt.Println("调用了Print()方法")
fmt.Println("学生的名字是:", s.Name)
}
func (s Student32) AGetSum(n1, n2 int) int {
fmt.Println("调用了AGetSum方法")
return n1 + n2
}
func (s Student32) BSet(name string, age int) {
s.Name = name
s.Age = age
}
// 定义函数操作结构体进行反射操作:
func TestStudent32Struct(a interface{}) {
//a转成reflect.Value类型:
val := reflect.ValueOf(a)
fmt.Println(val)
//通过reflect.Value类型操作结构体内部的字段:
n1 := val.NumField()
fmt.Println(n1)
//遍历-获取具体的字段:
for i := 0; i < n1; i++ {
fmt.Printf("第%d个字段的值是:%v", i, val.Field(i))
}
fmt.Println()
//通过reflect.Value类型操作结构体内部的方法:
n2 := val.NumMethod()
fmt.Println(n2)
//调用CPrint()方法:
//调用方法,方法的首字母必须大写才能有对应的反射的访问权限
//方法的顺序按照ASCII的顺序排列的,a,b,c,,,,,,索引:0,1,2,,,,,
val.Method(2).Call(nil)
//调用AGetSum方法:
//定义Value的切片:
var params []reflect.Value
params = append(params, reflect.ValueOf(10))
params = append(params, reflect.ValueOf(20))
result := val.Method(0).Call(params)
fmt.Println("AGetSum方法的返回值为:", result[0].Int())
}
func main() {
//定义结构体具体的实例:
s := Student32{
Name: "丽丽",
Age: 18,
}
//调用TestStudent32Struct:
TestStudent32Struct(s)
}
/*
{丽丽 18}
2
第0个字段的值是:丽丽第1个字段的值是:18
3
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
编辑 (opens new window)