声明
本文主要记录本人在使用iris框架mvc模块过程中犯过引起controller反射出错的错误,仅供参考。如有未收录的情况实属正常。
controller出现反射错误,只能在异常信息中看到异常类型,但异常栈中找不到具体出错的代码。调试起来相当困难,自己写的代码还好,要是别人拿代码来找你,别提多????疼了。因此记录下遇到的情况,要是遇到类似错误,按图索骥,排查问题。
前言
iris官网,在其GitHub仓库的_example文件夹能够找到示例,但没有使用文档。要熟悉框架,老老实实爬代码去吧(╯▔皿▔)╯
mvc pattern简介
~blablabla~
iris mvc 简介
~blablabla~
controller反射出错
controller与反射
非单例模式下,mvc模块会为每个请求实例化一个controller(有误欢迎指正)。这时就会从通过 mvc.New() 注册到app的controller实例拷贝一份。到具体类型的 struct 使用的就是golang的 reflect 模块。
我遇到的情况
struct定义使用私有成员变量
type MyController struct{
repositroy mydto.Repositroy
Ctx iris.Context
}
以上 repositroy 用于数据库操作,由于是私有成员,导致反射时无法实例化该变量,导致了反射异常,会报 nil point 错误。
具体handler方法入参错误
controller的handler方法定义时出参不容易出错(反正就几种情况),但我就犯过入参的错误。看代码
func (c *MyController) Get(ip sting) error{
···
}
controller的handler方法默认是没有入参的。所有需要入参的方法必须在 BeforeActivation( mvc.BeforeActivation){} 中注册。
func (c *MyController) BeforeActivation(b mvc.BeforeActivation){
b.Handle("GET","/{ip:string}","Get")
}
如果没有这一步,就会出现reflect出错。如需json参数,可以使用定义的 Ctx 变量,反射时框架会注入相应的context。
有疑问加站长微信联系(非本文作者)