本文主要記錄本人在使用iris框架mvc模塊過程當中犯過引發controller反射出錯的錯誤,僅供參考。若有未收錄的狀況實屬正常。golang
controller出現反射錯誤,只能在異常信息中看到異常類型,但異常棧中找不到具體出錯的代碼。調試起來至關困難,本身寫的代碼還好,要是別人拿代碼來找你,別提多🍒疼了。所以記錄下遇到的狀況,要是遇到相似錯誤,按圖索驥,排查問題。數據庫
iris官網,在其GitHub倉庫的_example文件夾可以找到示例,但沒有使用文檔。要熟悉框架,老老實實爬代碼去吧(╯▔皿▔)╯json
~blablabla~mvc
~blablabla~app
非單例模式下,mvc模塊會爲每一個請求實例化一個controller(有誤歡迎指正)。這時就會從經過 mvc.New() 註冊到app的controller實例拷貝一份。到具體類型的 struct 使用的就是golang的 reflect 模塊。框架
type MyController struct{ repositroy mydto.Repositroy Ctx iris.Context }
以上 repositroy 用於數據庫操做,因爲是私有成員,致使反射時沒法實例化該變量,致使了反射異常,會報 nil point 錯誤。調試
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。文檔