Revel中是如何实现根据路由动态加载控制器的?

如题目内容,controller文件夹下有各种controller,只需在conf/routes中对应路由表,各个controller实例会自动生成。
revel/controller.go中:

func RegisterController(c interface{}, methods []*MethodType) {
    // De-star the controller type
    // (e.g. given TypeOf((*Application)(nil)), want TypeOf(Application))
    var t reflect.Type = reflect.TypeOf(c)
    var elem reflect.Type = t.Elem()

    // De-star all of the method arg types too.
    for _, m := range methods {
        m.lowerName = strings.ToLower(m.Name)
        for _, arg := range m.Args {
            arg.Type = arg.Type.Elem()
        }
    }

    controllers[strings.ToLower(elem.Name())] = &ControllerType{
        Type:              elem,
        Methods:           methods,
        ControllerIndexes: findControllers(elem),
    }
    TRACE.Printf("Registered controller: %s", elem.Name())
}

RegisterController方法在哪儿调用啊,没找到。
我很想知道参数c interface{}的type是如何赋值的。

共 2 个回复


jimmykuu

revel 有个代码预生成的自动操作,代码都在 app/tmp/main.go 中,去看看这个文件就知道了。

# 0

tankerwng

@jimmykuu,谢谢啊,已找到了。
不过,app/tmp/main.go是结果,不是原始调用,实际上是通过go/ast“打印”出来的,其实是在

revel/cmd/harness/build.go#369

revel.RegisterController((*{{index $.ImportPaths .ImportPath}}.{{.StructName}})(nil)...

感谢@huacnlee,呵呵,他告诉我的。

https://ruby-china.org/topics/27324

# 1