原創(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í)的全棧工程師逢唤。
熱愛生活拉讯,喜歡跑步,家庭是我不斷向前進步的動力鳖藕。