Go - var 和 func 定义函数的区别

Go - The difference between var and func to define a function

我有 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

而且这2个有一些区别(即大小分配,第一个是单实例,而另一个returns每次调用一个实例,...),所以基于用例,我们可以推断出使用哪个。现在我是 golang 的新手,想知道以下 2 个函数定义(如果我用词有误请纠正我)在 Golang 中是否不同,如果有,有什么不同?

var inc1 = func(x int) int { return x + 1 }
func inc2(x int) int { return x + 1 }

提前致谢!

Scala 大量借鉴了 functional programming。 Go 没有。

(如果您使用过多种其他编程语言,您绝对应该阅读 Go specification。它不是很长,因为 Go 不是一种非常庞大的语言,尽管新的泛型肯定会使事情复杂化一些。 )

在Go中,func关键字引入函数定义或函数类型,详情为context-dependent。 var关键字引入变量声明。1 所以:

func inc2(x int) int { return x + 1 }

定义了一个函数,inc2,其代码如图所示。但是:

var inc1 = // ...

声明然后初始化一个变量,inc1。变量的type和初始value由commented-out段决定,所以:

var inc1 = func(x int) int { return x + 1 }

定义了一个函数(没有名字),其代码如下所示。然后将该函数分配给变量作为其初始值,因此变量的隐含类型是func (int) int或函数采用一个 int 类型的参数并返回一个 int.

类型的值

创建变量后,您现在可以调用当前存储在的函数:

func callit(arg int) {
    result := inc1(arg)
    // ... do something with the result ...
}

或者您可以为变量分配一个新值,例如:

func overwrite() {
    inc1 = func(a int) int { return a * 2 } // name `inc1` is now misleading
}

因为 inc2 是一个函数,你不能 re-assign 给它一个新值:它只是一个函数,不是变量。


1注意带初始化的变量声明可以使用“短声明”形式:

func f() {
    v := 3
    // ...
 }

我们省略了类型,只说“使用表达式的类型来确定声明的类型”。这声明并初始化变量。短声明只能出现在块范围内,因此它们必须在某个函数内。除了省略 var 关键字外,它们不会做任何你通过包含 var 关键字或有时包含多个 var 关键字无法做到的事情:

    result, err := doit()

可能需要:

    var result someType
    var err error
    result, err = doit()

不使用 short-declaration 形式编写时。