type_name(expression)舉例:
package main import "fmt" type CalculateType func(int, int) // 声明了一个函数类型 // 该函数类型实现了一个方法 func (c *CalculateType) Serve() { fmt.Println("我是一个函数类型") } // 加法函数 func add(a, b int) { fmt.Println(a + b) } // 乘法函数 func mul(a, b int) { fmt.Println(a * b) } func main() { a := CalculateType(add) // 将add函数强制转换成CalculateType类型 b := CalculateType(mul) // 将mul函数强制转换成CalculateType类型 a(2, 3) b(2, 3) a.Serve() b.Serve() } // 5 // 6 // 我是一个函数类型 // 我是一个函数类型如上,宣告了一個CalculateType 函數類型,並實作Serve() 方法,並將擁有相同參數的add 和mul 強制轉換成CalculateType 函數類型,同時這兩個函數都擁有了CalculateType 函數類型的Serve() 方法。
package main import "fmt" type CalculateType func(a, b int) int // 声明了一个函数类型 // 加法函数 func add(a, b int) int { return a + b } // 乘法函数 func mul(a, b int) int { return a * b } func Calculate(a, b int, f CalculateType) int { return f(a, b) } func main() { a, b := 2, 3 fmt.Println(Calculate(a, b, add)) fmt.Println(Calculate(a, b, mul)) } // 5 // 6如上例子,Calculate 的f 參數類型為CalculateType,add 和mul 函數具有和CalculateType 函數類型相同的參數和傳回值,因此可以將add 和mul 函數作為參數傳入Calculate 函數中。
// HandleFunc registers the handler function for the given pattern // in the DefaultServeMux. // The documentation for ServeMux explains how patterns are matched. func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) { DefaultServeMux.HandleFunc(pattern, handler) }
// HandleFunc registers the handler function for the given pattern. func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) { mux.Handle(pattern, HandlerFunc(handler)) }
type HandlerFunc func(ResponseWriter, *Request) // ServeHTTP calls f(w, r). func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) { f(w, r) }剛開始看到這段原始碼的時候,真的有點懵逼了,這段原始碼的目的是為了將我們的Handler 強制實作ServeHTTP() 方法,如下例子:
func sayHi(w http.ResponseWriter, r *http.Request) { io.WriteString(w, "hi") } func main() { http.HandlerFunc("/", sayHi) http.ListenAndserve(":8080", nil) }因為HandlerFunc 是一個函式類型,而sayHi 函式擁有和HandlerFunc 函式類型一樣的參數值,因此可以將sayHi 強制轉換成HandlerFunc,因此sayHi 也擁有了ServeHTTP() 方法,也就實現了Handler 接口,同時,HandlerFunc 的ServeHTTP 方法執行了它自己本身,也就是sayHi 函數,這也就可以看出來了,sayHi 就是Handler 被調用之後的執行結果。 ###
以上是詳解Golang中函數作為值與型的詳細內容。更多資訊請關注PHP中文網其他相關文章!