Go:反射

Go:反射

1. 类型

func TestType(t *testing.T)  {
	var i int = 1
	k := reflect.ValueOf(i).Kind()
	b := k == reflect.Int
	fmt.Println(b)
}

控制台:

=== RUN   TestType
true
--- PASS: TestType (0.00s)
PASS

2. 值

func TestValue(t *testing.T) {
	var i int = 1
	r := reflect.ValueOf(i)
	fmt.Println(r.Interface())
}

控制台:

=== RUN   TestValue
1
--- PASS: TestValue (0.00s)
PASS

3. 指针类型

func TestPoint(t *testing.T) {
	var i int = 1
	r := reflect.ValueOf(&i)
	// 检查类型
	fmt.Println(r.Kind() == reflect.Ptr)
	// 取值
	fmt.Println(r.Elem().Interface())
}

控制台:

=== RUN   TestPoint
true
1
--- PASS: TestPoint (0.00s)
PASS

4. 数组

func TestArray(t *testing.T) {
	var arr [4]int = [4]int{11, 22, 33, 44}
	r := reflect.ValueOf(arr)
	// 检查类型
	fmt.Println(r.Kind() == reflect.Array)
	// 遍历
	for i:=0; i<r.Len(); i++ {
		fmt.Println(r.Index(i).Interface())
	}
}

控制台:

=== RUN   TestSlice
true
11
22
33
44
--- PASS: TestSlice (0.00s)
PASS

5. slice

func TestSlice(t *testing.T) {
	var arr []int = []int{11, 22, 33, 44}
	r := reflect.ValueOf(arr)
	// 检查类型
	fmt.Println(r.Kind() == reflect.Slice)
	// 遍历
	for i:=0; i<r.Len(); i++ {
		fmt.Println(r.Index(i).Interface())
	}
}

控制台:

=== RUN   TestSlice
true
11
22
33
44
--- PASS: TestSlice (0.00s)
PASS

6. 结构体

func TestStruct(t *testing.T) {
	type People struct {
		Name string
		Age  int
	}

	p := People{Name: "yimt", Age: 123}
	r := reflect.ValueOf(p)
	// 检查类型
	fmt.Println(r.Kind() == reflect.Struct)
	// 数据
	fmt.Println(r.Interface())
	// 取字段
	fmt.Printf("总字段数:%d 第1个字段:%v 第2个字段:%v\n",
		r.NumField(),
		r.Field(0).Interface(),
		r.Field(1).Interface(),
	)
}

控制台:

=== RUN   TestStruct
true
{yimt 123}
总字段数:2 第1个字段:yimt 第2个字段:123
--- PASS: TestStruct (0.00s)
PASS

7. 修改值

func TestChangeValue(t *testing.T) {
	var i int = 1
	r := reflect.ValueOf(&i)
	r.Elem().SetInt(123)

	fmt.Println(i)
}

控制台:

=== RUN   TestChangeValue
123
--- PASS: TestChangeValue (0.00s)
PASS

8. 方法

8.1. 普通方法

func Sum(a, b int) int {
	return a + b
}

func TestCallFunc(t *testing.T) {
	r := reflect.ValueOf(Sum)

	// result执行结果,slice类型
	result := r.Call([]reflect.Value{
		reflect.ValueOf(1), // 第1个参数
		reflect.ValueOf(2), // 第2个参数
	})

	t.Log(result[0].Interface())
}

控制台:

=== RUN   TestCallFunc
    reflect_test.go:28: 3
--- PASS: TestCallFunc (0.00s)
PASS

8.2. 成员方法

8.2.1. 遍历

type Demo struct {
}

func (this *Demo) Sum(a, b int) int {
	return a + b
}

func (this *Demo) Minus(a, b int) int {
	return a - b
}

func TestCallFunc(t *testing.T) {
	d := new(Demo)

	r := reflect.ValueOf(d)

	// 遍历执行所有的方法
	for i := 0; i < r.NumMethod(); i++ {
		result := r.Method(i).Call([]reflect.Value{
			reflect.ValueOf(1), // 第1个参数
			reflect.ValueOf(2), // 第2个参数
		})
		t.Log(result[0].Interface())
	}
}

控制台:

=== RUN   TestCallFunc
    reflect_test.go:30: -1
    reflect_test.go:30: 3
--- PASS: TestCallFunc (0.00s)
PASS

8.2.2. 指定方法名

type Demo struct {
}

func (this *Demo) Sum(a, b int) int {
	return a + b
}

func (this *Demo) Minus(a, b int) int {
	return a - b
}

func TestCallFunc(t *testing.T) {
	d := new(Demo)

	r := reflect.ValueOf(d)

	// 通过方法名调用方法
	result := r.MethodByName("Sum").Call([]reflect.Value{
		reflect.ValueOf(1),
		reflect.ValueOf(2),
	})

	t.Log(result[0].Interface())
}

控制台:

=== RUN   TestCallFunc
    reflect_test.go:30: 3
--- PASS: TestCallFunc (0.00s)
PASS

你可能感兴趣的:(Go,反射,go,go,reflect,ValueOf,TypeOf)