如果提var
是你的主要問題,你可以輕鬆地刪除它,通過改變=
到:=
,像這樣:
english := Greeting(func(name string) string {
return ("Hello, " + name);
})
但是,你甚至不必投你的函數爲Greeting
。規範說這是關於function types:
函數類型表示具有相同參數和結果類型的所有函數的集合。
而這大約type identity:
兩個函數類型是相同的,如果它們具有相同數量的參數和結果值,相應的參數和結果類型是相同的,並且或者兩個功能都可變參數或既不是。參數和結果名稱不需要匹配。
這意味着每個函數都有自己的函數類型。如果兩個函數具有相同的簽名(參數和結果類型),則它們共享一個函數類型。通過編寫type Greeting func...
,你只是給一個特定的函數類型命名,而不是定義一個新的類型。
所以,下面的代碼工作,我希望顯示圍棋與函數類型工作的正確方法:
package main
import "fmt"
type Greeting func(name string) string
func say(g Greeting, n string) { fmt.Println(g(n)) }
func french(name string) string { return "Bonjour, " + name }
func main() {
english := func(name string) string { return "Hello, " + name }
say(english, "ANisus")
say(french, "ANisus")
}
請注意,我也下降了分號和括號從english
功能。如果他們不需要,開發人員不要使用這些標點符號。
UPDATE:既然您已經提供了示例代碼,我可以清楚地理解問題。
爲此,您的代碼已經足夠好了,而且沒有太多的其他方法可以做到這一點。如果你喜歡,你可以在調用方法之前施放:
english := func(name string) string { return "Hello, " + name }
Greeting(english).exclamation("ANisus")
但我不確定這是一種改進。我只是說你想做什麼似乎沒有其他方法來編寫代碼。
也就是說,如果我們不想改變你的類型。我的意思是,調用函數類型方法的整個想法看起來有點奇怪。這並不是錯的,但有點罕見。以更常用的方式實現相同效果的另一種方法是通過結構類型併爲該函數提供一個字段。事情是這樣的:
package main
import "fmt"
type Greeting struct {
say func(name string) string
}
func newGreeting(f func(string) string) *Greeting {
return &Greeting{say: f}
}
func (g *Greeting) exclamation(name string) string { return g.say(name) + "!" }
func main() {
english := &Greeting{say: func(name string) string {
return "Hello, " + name
}}
french := newGreeting(func(name string) string {
return "Bonjour, " + name
})
fmt.Println(english.exclamation("ANisus"))
fmt.Println(french.exclamation("ANisus"))
}
這裏english
和french
顯示編碼同一件事的兩種不同的方式。再說一遍,我並不是說這是更好的解決方案,而是更常見和更靈活的達到同樣效果的方式。
由於您將'english'聲明爲全局變量,因此不能刪除'var'。 – Mostafa 2012-02-22 21:29:23