golang iris mvc controller出现reflect异常

声明

本文主要记录本人在使用iris框架mvc模块过程当中犯过引发controller反射出错的错误,仅供参考。若有未收录的状况实属正常。golang

controller出现反射错误,只能在异常信息中看到异常类型,但异常栈中找不到具体出错的代码。调试起来至关困难,本身写的代码还好,要是别人拿代码来找你,别提多🍒疼了。所以记录下遇到的状况,要是遇到相似错误,按图索骥,排查问题。数据库

前言

iris官网,在其GitHub仓库的_example文件夹可以找到示例,但没有使用文档。要熟悉框架,老老实实爬代码去吧(╯▔皿▔)╯json

mvc pattern简介

~blablabla~mvc

iris mvc 简介

~blablabla~app

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方法定义时出参不容易出错(反正就几种状况),但我就犯过入参的错误。看代码code

func (c *MyController) Get(ip sting) error{
    ···
}

controller的handler方法默认是没有入参的。全部须要入参的方法必须在 BeforeActivation( mvc.BeforeActivation){} 中注册。ip

func (c *MyController) BeforeActivation(b mvc.BeforeActivation){
    b.Handle("GET","/{ip:string}","Get")
}

若是没有这一步,就会出现reflect出错。如需json参数,可使用定义的 Ctx 变量,反射时框架会注入相应的context。文档

相关文章
相关标签/搜索