我有 Scala 背景,在 Scala 中,您可以将函数定义为单个值或实际函数,例如:
val inc1: Int => Int = _ + 1 // single FUNCTION value
def inc2(x: Int): Int = x + 1 // normal function definition
// in this case "inc1 eq inc1" is true, since this is a single instance
// but "inc2 eq inc2" is false
Run Code Online (Sandbox Code Playgroud)
这两个有一些差异(即大小分配,第一个是单个实例,而另一个每次调用时都会返回一个实例,...),因此根据用例,我们可以推断出一个使用。现在我是 golang 的新手,想知道以下 2 个函数定义(如果我的短语有误请纠正我)在 Golang 中是否有所不同,如果有的话,有什么不同?
var inc1 = func(x int) int { return x + 1 }
func inc2(x int) int { return x + 1 }
Run Code Online (Sandbox Code Playgroud)
提前致谢!
Scala 借鉴了函数式编程的很多东西。Go 则不然。
(如果您使用过多种其他编程语言,那么您绝对应该阅读Go 规范。它不是很长,因为 Go 不是一种非常大的语言,尽管新的泛型肯定会让事情变得有点复杂。)
在 Go 中,func关键字引入函数定义或函数类型,详细信息取决于上下文。该var关键字引入了变量声明。1 所以:
func inc2(x int) int { return x + 1 }
Run Code Online (Sandbox Code Playgroud)
定义了一个函数 ,inc2其代码如图所示。但:
var inc1 = // ...
Run Code Online (Sandbox Code Playgroud)
声明并初始化一个变量inc1。变量的类型和初始值由注释掉的部分决定,因此:
var inc1 = func(x int) int { return x + 1 }
Run Code Online (Sandbox Code Playgroud)
定义了一个函数(没有名称),其代码如下所示。然后将该函数分配给该变量作为其初始值,以便该变量的隐含类型是func (int) int或 函数,它采用一个 type 参数int并返回一个 type 值int。
创建变量后,您现在可以调用当前存储在该变量中的函数:
func callit(arg int) {
result := inc1(arg)
// ... do something with the result ...
}
Run Code Online (Sandbox Code Playgroud)
或者您可以为变量分配一个新值,例如:
func overwrite() {
inc1 = func(a int) int { return a * 2 } // name `inc1` is now misleading
}
Run Code Online (Sandbox Code Playgroud)
因为inc2是一个函数,所以您不能为其重新分配新值:它只是一个函数,而不是一个变量。
1请注意,带有初始化的变量声明可以使用“短声明”形式:
func f() {
v := 3
// ...
}
Run Code Online (Sandbox Code Playgroud)
我们省略了类型,只是说“使用表达式的类型来确定声明的类型”。这声明并初始化了变量。短声明只能出现在块作用域中,因此它们必须位于某个函数内。除了省略关键字之外,它们没有做任何通过包含关键字或有时包含多个关键字var无法做到的事情:varvar
result, err := doit()
Run Code Online (Sandbox Code Playgroud)
可能需要:
var result someType
var err error
result, err = doit()
Run Code Online (Sandbox Code Playgroud)
不使用简短声明形式编写时。