理解go的function types

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

今天看Martini文檔,其功能列表提到完全兼容http.HandlerFunc接口,就去查閱了Go: net/http的文檔,看到type HandlerFunc這部分,頓時蒙圈了。由于之前學習的時候沒有關(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ù)。

我是咕咕雞,一個還在不停學習的全棧工程師。
熱愛生活,喜歡跑步,家庭是我不斷向前進步的動力。

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

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

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

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