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())
}