gin controller 自動注冊

反射入門可以先看這個http://colobu.com/2015/09/23/laws-of-goang-reflection/

因為在使用gin框架吆寨,在配置路由的時候需要手動配置撼短,如下:

    r.GET("/page",controller.Page)
    r.GET("/index",controller.Index)

其中controller是包名托修,如果在controller包中再增加方法,那就需要在這個地方繼續(xù)更新包翅溺,所以考慮有沒有方法自動掃描controller中的包脑漫,進行自動注冊呢髓抑。

于是想到了反射咙崎,但是查閱資料沒有發(fā)現(xiàn)可以用反射來提取包中的方法。只能另尋思路吨拍。

新的思路是褪猛,新建一個類,每個控制方法都屬于這個類羹饰。
如下:

type Ctl struct{
}

那么這個時候伊滋,就可以通過Ctl這個類對象來獲取其所有的方法,這樣就可以根據(jù)方法來設置路由規(guī)則队秩,達到自動掃描功能笑旺。

其中controller這樣寫:

func (this *Ctl) GETPage(c *gin.Context){
    c.HTML(http.StatusOK, "page/page.tmpl",gin.H{
        "title":"TEST",
    })
}

反射中這樣寫的:

    ctl := controller.Ctl{}
    // 通過反射獲取ctl中的所有方法
    refCtl := reflect.TypeOf(&ctl)
    methodCnt := refCtl.NumMethod()
    for index := 0; index<methodCnt; index++{
        m := refCtl.Method(index)
        methodName := m.Name
        if strings.HasPrefix(methodName,"GET") {
            name := strings.ToLower(strings.Replace(methodName,"GET","",1))
            fmt.Println(name)
            r.GET(name,m.Func.Interface().(gin.HandlerFunc))
            //r.GET(name,m.Func)
        }
    }

然而最終給我報錯,

interface {} is func(*controller.Ctl, *gin.Context), not gin.HandlerFunc

到這我明白了馍资,形如func (this *Ctl) GETPage(c *gin.Context)的函數(shù)筒主,其底層其實是func GETPage(this *Ctl, c *gin.Context)

但是雖然如此,這個問題依然沒難倒我(用了一下午想出來一個辦法鸟蟹。乌妙。)
方法是使用map保存path和方法的映射,router中設置統(tǒng)一入口建钥,在該入口進行路由配置藤韵,代碼如下:

package router

import (
    "github.com/gin-gonic/gin"
    "blog/controller"
    "reflect"
    "strings"
)

var (
    ctl = controller.Ctl{}
    methods = make(map[string]reflect.Method)
)


func SetRouter(r *gin.Engine){
    // 通過反射獲取ctl中的所有方法
    refCtl := reflect.TypeOf(&ctl)
    methodCnt := refCtl.NumMethod()
    for index := 0; index<methodCnt; index++{
        m := refCtl.Method(index)
        methodName := m.Name
        if strings.HasPrefix(methodName,"GET") {
            name := strings.ToLower(strings.Replace(methodName,"GET","",1))
            //將path對應的反射方法保存
            methods[name] = m
            // 設置路由統(tǒng)一入口
            r.GET(name,doHandle)
        }
    }
}

//統(tǒng)一入口
func doHandle(ctx *gin.Context){
    //獲取path
    p := strings.Split(ctx.Request.URL.Path,"/")[1]
    vals := make([]reflect.Value,2)
    vals[0] = reflect.ValueOf(&ctl)
    vals[1] = reflect.ValueOf(ctx)
    //反射進行調用
    methods[p].Func.Call(vals)
}

當然這只是提供一種思路,實際使用的時候熊经,因為路由的配置相當復雜泽艘,還是建議手動進行配置

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市镐依,隨后出現(xiàn)的幾起案子匹涮,更是在濱河造成了極大的恐慌,老刑警劉巖馋吗,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件焕盟,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機脚翘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門灼卢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人来农,你說我怎么就攤上這事鞋真。” “怎么了沃于?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵涩咖,是天一觀的道長。 經常有香客問我繁莹,道長檩互,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任咨演,我火速辦了婚禮闸昨,結果婚禮上,老公的妹妹穿的比我還像新娘薄风。我一直安慰自己饵较,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布遭赂。 她就那樣靜靜地躺著循诉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪撇他。 梳的紋絲不亂的頭發(fā)上茄猫,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音逆粹,去河邊找鬼募疮。 笑死,一個胖子當著我的面吹牛僻弹,可吹牛的內容都是我干的阿浓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蹋绽,長吁一口氣:“原來是場噩夢啊……” “哼芭毙!你這毒婦竟也來了?” 一聲冷哼從身側響起卸耘,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤退敦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蚣抗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侈百,經...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了钝域。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讽坏。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖例证,靈堂內的尸體忽然破棺而出路呜,到底是詐尸還是另有隱情,我是刑警寧澤织咧,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布胀葱,位于F島的核電站,受9級特大地震影響笙蒙,放射性物質發(fā)生泄漏抵屿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一手趣、第九天 我趴在偏房一處隱蔽的房頂上張望晌该。 院中可真熱鬧肥荔,春花似錦绿渣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至誉帅,卻和暖如春淀散,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚜锨。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工档插, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人亚再。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓郭膛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親氛悬。 傳聞我的和親對象是個殘疾皇子则剃,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359