如果提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