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。文檔

相關文章
相關標籤/搜索