golang beego router controller 调用解析

beego 中 调用 beego.Router 方法 添加路由 

router add 方法处理 赋值给 controllerInfo 构造体 controllerType  属性

其中处理代码如下方  beego/router.go


func (p *ControllerRegister) Add(pattern string, c ControllerInterface, mappingMethods ...string) {
	reflectVal := reflect.ValueOf(c) 
	t := reflect.Indirect(reflectVal).Type()
	route := &controllerInfo{}
	route.controllerType = t
}

我这边只是看他的router controller的处理 其他代码全部给删除了

controller处理

在router ServeHTTP

重写 go net/http  Handler interface

type Handler interface {  
    ServeHTTP(ResponseWriter, *Request)  
}  

其中处理代码如下方  beego/router.go

func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request) {  
  
    // also defined runRouter & runMethod from filter  
    if !isRunnable {  
        //Invoke the request handler  
        vc := reflect.New(runRouter)  
        //断言方式  
        execController, ok := vc.Interface().(ControllerInterface)  
        if !ok {  
            panic("controller is not ControllerInterface")  
        }  
  
        if !context.ResponseWriter.Started {  
            switch runMethod {
                default:
                    //调用beego ControllerInterface 接口 
                    //最终调用 Controller构造体  HandlerFunc方法  
                   if !execController.HandlerFunc(runMethod) { 
                        var in []reflect.Value  
                        //选择调用的方法  
                        method := vc.MethodByName(runMethod)  
                        //调用方法 并传递参数  
                        method.Call(in)  
                    }
            }
 
        }  
   
    }  
  
}  




整套 反射方法调用测试代码

package main

import (
	"fmt"
	"reflect"
)

type Xiao struct {
}

func (this Xiao) Xiaochuan() {
	fmt.Println("this is xiao test")
}

func main() {

	reflectVal := reflect.ValueOf(Xiao{})
	t := reflect.Indirect(reflectVal).Type()
	//反射调用
	var in []reflect.Value
	vc := reflect.New(t)
	method := vc.MethodByName("Xiaochuan")
	method.Call(in)
}

你可能感兴趣的:(GoLang)