理解go的function types

原創(chuàng)文章轉(zhuǎn)載請注明出處

今天看Martini文檔,其功能列表提到完全兼容http.HandlerFunc接口清钥,就去查閱了Go: net/http的文檔,看到type HandlerFunc這部分,頓時蒙圈了窑邦。由于之前學(xué)習(xí)的時候沒有關(guān)注過function types的知識點,就Google了一些文章壕探,才算是有了個大概的了解冈钦。

從golang的官方文檔得知function types的解釋是這樣的。

A function type denotes the set of all functions with the same parameter and result types.

先找個例子來看一下:

package main

import "fmt"

// Greeting function types
type Greeting func(name string) string

func say(g Greeting, n string) {
    fmt.Println(g(n))
}

func english(name string) string {
    return "Hello, " + name
}

func main() {
    say(english, "World")
}

輸出Hello, World

say()函數(shù)要求傳入一個Greeting類型李请,因為english函數(shù)的參數(shù)和返回值跟Greeting一樣瞧筛,參考接口的概念這里可以做類型轉(zhuǎn)換。我們換個方式來實現(xiàn)上面的功能:

package main

import "fmt"

// Greeting function types
type Greeting func(name string) string

func (g Greeting) say(n string) {
    fmt.Println(g(n))
}

func english(name string) string {
    return "Hello, " + name
}

func main() {
    g := Greeting(english)
    g.say("World")
}

同樣輸出Hello, World导盅,只是給Greeting類型添加了say()方法较幌。上面說了,函數(shù)類型是表示所有包含相同參數(shù)和返回類型的函數(shù)集合白翻。我們在一開始先把func(name string) string這樣的函數(shù)聲明成Greeting類型乍炉,接著我們通過Greeting(english)english函數(shù)轉(zhuǎn)換成Greeting類型。通過這個轉(zhuǎn)換以后嘁字,我們就可以借由變量g調(diào)用Greeting類型的say()方法恩急。兩段代碼的差異就是go的類型系統(tǒng)添加方法和類C++語言添加類型方法的差異,具體講解可以去查看《Go語言編程》第3章為類型添加方法這一節(jié)纪蜒。

既然是函數(shù)集合衷恭,那么只有一個函數(shù)顯然是不足以說明問題的。

package main

import "fmt"

// Greeting function types
type Greeting func(name string) string

func (g Greeting) say(n string) {
    fmt.Println(g(n))
}

func english(name string) string {
    return "Hello, " + name
}

func french(name string) string {
    return "Bonjour, " + name
}

func main() {
    g := Greeting(english)
    g.say("World")
    g = Greeting(french)
    g.say("World")
}

輸出

Hello, World
Bonjour, World

在其他語言里面纯续,有些函數(shù)可以直接作為參數(shù)傳遞随珠,有些是以函數(shù)指針進行傳遞,但是都沒有辦法像go這樣可以給函數(shù)類型“增加”新方法猬错。

回到Go: net/http的HandlerFunc類型窗看,只要Martini的函數(shù)遵循文檔中type HandlerFunc func(ResponseWriter, *Request)的要求,就可以轉(zhuǎn)換成HandlerFunc類型倦炒,也就可以調(diào)用func (HandlerFunc)ServeHTTP函數(shù)显沈。

我是咕咕雞,一個還在不停學(xué)習(xí)的全棧工程師逢唤。
熱愛生活拉讯,喜歡跑步,家庭是我不斷向前進步的動力鳖藕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末魔慷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子著恩,更是在濱河造成了極大的恐慌院尔,老刑警劉巖蜻展,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異邀摆,居然都是意外死亡纵顾,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門隧熙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來片挂,“玉大人,你說我怎么就攤上這事贞盯∫裟睿” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵躏敢,是天一觀的道長闷愤。 經(jīng)常有香客問我,道長件余,這世上最難降的妖魔是什么讥脐? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮啼器,結(jié)果婚禮上旬渠,老公的妹妹穿的比我還像新娘。我一直安慰自己端壳,他們只是感情好告丢,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著损谦,像睡著了一般岖免。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上照捡,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天颅湘,我揣著相機與錄音,去河邊找鬼栗精。 笑死闯参,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的悲立。 我是一名探鬼主播鹿寨,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼级历!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起叭披,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤寥殖,失蹤者是張志新(化名)和其女友劉穎玩讳,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嚼贡,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡熏纯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了粤策。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片樟澜。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖叮盘,靈堂內(nèi)的尸體忽然破棺而出秩贰,到底是詐尸還是另有隱情,我是刑警寧澤柔吼,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布毒费,位于F島的核電站,受9級特大地震影響愈魏,放射性物質(zhì)發(fā)生泄漏觅玻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一培漏、第九天 我趴在偏房一處隱蔽的房頂上張望溪厘。 院中可真熱鬧,春花似錦牌柄、人聲如沸畸悬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽傻昙。三九已至,卻和暖如春彩扔,著一層夾襖步出監(jiān)牢的瞬間妆档,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工虫碉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贾惦,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓敦捧,卻偏偏與公主長得像须板,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子兢卵,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 出處---Go編程語言 歡迎來到 Go 編程語言指南习瑰。本指南涵蓋了該語言的大部分重要特性 Go 語言的交互式簡介,...
    Tuberose閱讀 18,403評論 1 46
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理秽荤,服務(wù)發(fā)現(xiàn)甜奄,斷路器柠横,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,776評論 1 10
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,524評論 25 707
  • 同學(xué)們有福了,花了一些時間课兄,重新整理了一個最完整的Mybatis Generator(簡稱MBG)的最完整配置文件...
    小碼哥教育520it閱讀 619評論 0 2