go 反射 reflect

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章