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
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
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
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
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
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
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
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
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
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