golang中的adapter function type

由于剛剛接觸golang,對語言和用法都不太熟,看到這種寫法感覺很奇怪:

type Handler interface {
    ServeHTTP(ResponseWriter, *Request)
}

type HandlerFunc func(ResponseWriter, *Request)

func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
     f(w, r)
}

我內(nèi)心就覺得為啥要這么多此一舉呢?把一個func定義為一個類型,然后實現(xiàn)ServeHTTP函數(shù)。為啥不直接用那個函數(shù)呢?

來看看http.ListenAndServe()接口的原型就明白了:

func ListenAndServe(addr string, handler Handler) error

函數(shù)的第二個參數(shù)是一個Handler interface,也就是說要使用這個函數(shù)那么需要傳入一個實現(xiàn)了ServerHTTP函數(shù)的類型。

對于復(fù)雜的應(yīng)用來說可能會專門定義一個struct來實現(xiàn)http.Handler接口,那么就傳入這個struct的事例進去就行了。但是如果簡單的應(yīng)用也這么做就有點劃不來了,因此http包提供了HandlerFunc類型來輔助用戶將一個函數(shù)快速轉(zhuǎn)換為符合http.Handler接口的類型。這種方法叫adapter function type[1]。

這種技巧的關(guān)鍵就是將符合接口的函數(shù)定義為類型,然后對這個類型實現(xiàn)接口中的函數(shù),實現(xiàn)的時候就直接調(diào)用自身。使用的時候只需要將自定義的函數(shù)(原型相同)做類型轉(zhuǎn)換就完成了。

實際上不光是標(biāo)準(zhǔn)庫用到這樣的技巧,在很多golang初學(xué)者都會看的groupcache中也用到了[2]

參考

[1] https://github.com/gopherchina/conference/blob/master/2017/1.3%20Go%20coding%20in%20go%20way.pdf

[2] https://github.com/golang/groupcache/blob/master/groupcache.go

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原文: https://github.com/ecomfe/spec/blob/master/javascript...
    zock閱讀 3,491評論 2 36
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,323評論 25 708
  • 我的夢想是,每天睡到自然醒,在一個陽光明媚的下午,喝喝下午茶,看看喜歡的書,順便劈劈情操。 沒有生活和工作的壓力,...
    anMoo韓魔閱讀 258評論 2 3
  • 課堂上被老師叫到Y(jié)F,就要踏上社會了你最擔(dān)心的是什么我說社會上壞人太多了大家哄堂大笑 真實的想法有那么好笑么忘記別...
    憶苦思甜想錦繡閱讀 166評論 0 1
  • 如果不是那次醫(yī)院籌錢的無助,讓我知道原來姐妹之間也是可以因為金錢而隔閡的,或許陸小曼把朋友看的很重不是沒有道理可言...
    傻不愣登的二貨閱讀 346評論 0 0

友情鏈接更多精彩內(nèi)容