先找個例子來看一下:
package main import "fmt" // Greeting function typestype 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()函數要求傳入一個Greeting類型,因為english函數的參數和傳回值跟Greeting一樣,參考介面的概念這裡可以做類型轉換。我們換個方式來實現上面的功能:
package main import "fmt" // Greeting function typestype 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()方法。上面說了,函數類型是表示所有包含相同參數和傳回型別的函數集合。我們在一開始先把func(name string) string這樣的函式宣告成Greeting類型,接著我們通過Greeting(english)將english函數轉換成Greeting類型。通過這個轉換以後,我們就可以藉由變數g調用Greeting類型的say()方法。
package main import "fmt" // Greeting function typestype 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
轉自:https://www.jianshu.com/p/fc4902159cf5