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

 

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