package main
import (
"fmt"
"reflect"
)
type MyMath struct {
Pi float64
}
//普通函数
func (myMath MyMath) Sum(a, b int) int {
return a + b
}
func (myMath MyMath) Dec(a, b int) int {
return a - b
}
type Student struct {
Name string `json:"name"`
Age int `json:"age"`
}
//普通函数
func add(a, b int) int {
return a + b
}
func main() {
var stu Student
typeOfStu := reflect.TypeOf(stu)
numField := typeOfStu.NumField()
fmt.Println(typeOfStu.Name(), typeOfStu.Kind(), numField)
for i:=0;i < numField; i++ {
reflectField := typeOfStu.Field(i)
fmt.Println(reflectField)
fmt.Println(reflectField.Tag, reflectField.Tag.Get("json"))
}
reflectV := reflect.ValueOf(stu)
fmt.Println(reflectV)
//----------通过反射调用函数---------
//将函数包装为反射值对象
funcValue := reflect.ValueOf(add)
//构造函数参数,传入两个整形值
paramList := []reflect.Value{reflect.ValueOf(2), reflect.ValueOf(3)}
//反射调用函数
retList := funcValue.Call(paramList)
fmt.Println(retList[0].Int())
//---------------通过反射调用方法----------------------
var myMath = MyMath{Pi:3.14159}
//获取myMath的值对象
rValue := reflect.ValueOf(myMath)
//获取到该结构体有多少个方法
numOfMethod := rValue.NumMethod()
fmt.Println("numOfMethod:",numOfMethod)
//构造函数参数,传入两个整形值
paramList1 := []reflect.Value{reflect.ValueOf(30), reflect.ValueOf(20)}
//调用结构体的第一个方法Method(0)
//注意:在反射值对象中方法索引的顺序并不是结构体方法定义的先后顺序
//而是根据方法的ASCII码值来从小到大排序,所以Dec排在第一个,也就是Method(0)
result := rValue.Method(0).Call(paramList1)
fmt.Println(result[0].Int())
}