標籤:ref crm 數列 讀取方法 建立 val import log string
package mainimport ("fmt""reflect")//定義控制器函數Map類型,便於後續快捷使用type ControllerMapsType map[string]reflect.Value//聲明控制器函數Map類型變數var ControllerMaps ControllerMapsType//定義路由器結構類型type Routers struct {}//為路由器結構附加功能控制器函數,值傳遞func (this *Routers) Login(msg string) {fmt.Println("Login:", msg)}//為路由器結構附加功能控制器函數,引用傳遞func (this *Routers) ChangeName(msg *string) {fmt.Println("ChangeName:", *msg)*msg = *msg + " Changed"}func main() {var ruTest RouterscrMap := make(ControllerMapsType, 0)//建立反射變數,注意這裡需要傳入ruTest變數的地址;//不傳入地址就只能反射Routers靜態定義的方法vf := reflect.ValueOf(&ruTest)vft := vf.Type()//讀取方法數量mNum := vf.NumMethod()fmt.Println("NumMethod:", mNum)//遍曆路由器的方法,並將其存入控制器映射變數中for i := 0; i < mNum; i++ {mName := vft.Method(i).Namefmt.Println("index:", i, " MethodName:", mName)crMap[mName] = vf.Method(i) //<<<}//示範testStr := "Hello Go"//建立帶調用方法時需要傳入的參數列表parms := []reflect.Value{reflect.ValueOf(testStr)}//使用方法名字串調用指定方法crMap["Login"].Call(parms)//建立帶調用方法時需要傳入的參數列表parms = []reflect.Value{reflect.ValueOf(&testStr)}//使用方法名字串調用指定方法crMap["ChangeName"].Call(parms)//可見,testStr的值已經被修改了fmt.Println("testStr:", testStr)}
reflect代碼使用