为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕神8447489 2022-12-13 10:29:47
我来自 Scala 背景,在 Scala 中,您可以将函数定义为单个值或实际函数,例如:val inc1: Int => Int = _ + 1 // single FUNCTION valuedef 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这两个有一些差异(即大小分配,第一个是单个实例,而另一个在每次调用时返回一个实例,...),因此根据用例,我们可以推断出哪个一个使用。现在我是 golang 的新手,想知道以下 2 个函数定义(如果我用词有误请纠正我)在 Golang 中是否不同,如果有,有什么区别?var inc1 = func(x int) int { return x + 1 }func inc2(x int) int { return x + 1 }提前致谢!
查看完整描述

1 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

Scala 大量借鉴了函数式编程。去没有。

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

在 Go 中,func关键字引入函数定义或函数类型,具体细节取决于上下文。关键字var引入变量声明。1 所以:

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

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

var inc1 = // ...

声明然后初始化一个变量,inc1变量的类型和初始由注释掉的部分决定,所以:

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

定义了一个函数(没有名字),其代码如下所示。然后将该函数分配给变量作为其初始值,因此变量的隐含类型func (int) intor function 接受一个 type 的参数int并返回一个 type 的值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是一个函数,你不能重新给它赋新值:它只是一个函数,不是变量。


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


func f() {

    v := 3

    // ...

 }

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


    result, err := doit()

可能需要:


    var result someType

    var err error

    result, err = doit()

在不使用简短声明形式编写时。


查看完整回答
反对 回复 2022-12-13
  • 1 回答
  • 0 关注
  • 143 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信