type NewFuncType FuncLiteral
依據Go語言型別系統的概念,NewFuncType 為新定義的函數命名型別,FuncLiteral 為函數位面量型別,FuncLiteral 為函數型別 NewFuneType 的底層型別,當然也可以使用 type 在一個函數型別中再定義一個新的函數型別,這種用法在語法上是允許的,但很少這麼使用,例如:type NewFuncType OldFuncType
//函數宣告=函數名+函數簽名
//函數簽名
func (InputTypeList)OutputTypeList
//函數宣告
func FuncName (InputTypeList)OutputTypeList
//有名函數定義,函數名是add //add 型別是函數位面量型別 func(int, int) int func add(a, b int) int { return a+b } //函數宣告語句,用於 Go 程式碼呼叫組合程式碼 func add(int, int) int //add 函數的簽名,實際上就是 add 的字面量型別 func (int, int) int //匿名函數不能獨立存在,常作為函數引數、返回值,或者賦值給某個變數 //匿名函數可以直接顯式初始化 //匿名函數的型別也是函數位面量型別 func (int, int) int func (a,b int) int { return a+b } //新定義函數型別ADD //ADD 底層型別是函數位面量型別 func (int, int) int type ADD func (int, int) int //add 和 ADD 的底層型別相同,並且 add 是字面量型別 //所以 add 可直接賦值給 ADD 型別的變數 g var g ADD = add func main() { f := func(a, b int) int { return a + b } g(1, 2) f(1, 2) //f 和 add 的函數簽名相同 fmt.Printf("%Tn", f) // func(int, int) int fmt.Printf("%Tn", add) // func(int, int) int }前面談到字面量型別是一種未命名型別 (unnamed type),其不能定義自己的方法,所以必須顯式地使用 type 宣告一個有名函數型別,然後為其新增方法,通常說的函數型別就是指有名函數型別,“函數簽名”是指函數的字面量型別,在很多地方把函數型別和函數簽名等價使用,這是不嚴謹的。
//src/net/http/server.go //定義一個有名函數型別 HandlerFune type HandlerFunc func(ResponseWriter, *Request) //為有名的函數型別新增方法 //這是一種包裝器的程式設計技巧 //ServeHTTP calls f(w, r). func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) { f(w, r) } //函數型別 HandlerFunc 實現了介面 Handler 的方法 type Handler interface { ServeHTTP(ResponseWriter, *Request) } func (mux *ServeMux) Handle(pattern string, handler Handler) //所以 HandlerFunc 型別的交量可以傳遞給 Handler 介面變數 func (mux *ServeMux) HandleFune (pattern string, handler func (ResponseWriter, *Request)) { mux.Handle(pattern, HandlerFunc(handler)) }通過 http 標準庫裡面對於函數型別的使用,我們可以看到函數型別的如下意義: