Function 在Go中何时使用函数表达式而不是函数声明?

Function 在Go中何时使用函数表达式而不是函数声明?,function,go,functional-programming,Function,Go,Functional Programming,在Go中何时使用函数表达式而不是函数声明 我搜索了函数表达式和函数声明(在JS中),这是关于提升的。Golang呢?Go中的匿名函数用于各种情况: -出发 go func() { // body }() -延期声明 defer func() { // body }() -作为另一个函数的参数 err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { // todo

在Go中何时使用函数表达式而不是函数声明


我搜索了函数表达式和函数声明(在JS中),这是关于提升的。Golang呢?

Go中的匿名函数用于各种情况:

-出发

go func() {
    // body
}()
-延期声明

defer func() {
    // body
}()
-作为另一个函数的参数

err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
    // todo
})
-作为结束()


函数声明用于按名称引用函数。您可以在自己的代码中从多个位置调用它,或者将其公开给其他包。

每个包都有一个唯一的属性:

  • 将标识符(函数名)绑定到函数;因此,函数名将是一个,您可以参考它

  • 表示匿名函数。函数文字是闭包,它们捕获周围的环境:它们可能引用周围函数中定义的变量。然后,这些变量在周围的函数和函数文本之间共享,只要它们是可访问的,它们就会存在

不要被蒙蔽:从语法上讲,每当使用函数文字时,也可以使用声明的函数。例如,以下代码是有效且有效的Go代码:

func do() {}

func main() {
    go do()
    defer do()
}
什么时候使用一个而不是另一个的答案在于上面列出的独特属性

当您想要引用函数时,当您想要重用函数时,请使用函数声明。这也是分离代码的好方法,函数声明必须在文件级别:不能在另一个函数中声明函数。有关详细信息,请参阅

当您希望函数能够访问局部变量及其周围的其他标识符时,请使用函数文字。由于您不能在另一个函数中声明函数,为了捕获局部变量和标识符,这里唯一的选项是函数文本(除非您希望将所有内容作为参数传递给已声明的函数,如果函数需要修改值(在这种情况下,值需要“转换”),则可能会很快变脏输入指针和地址(需要传递)。有关有趣的相关问题,请查看

当函数不需要名称,且函数不需要访问局部变量时,您可以根据自己的判断、其他(质量)项目中的示例和以前的经验选择使用哪一个。如果函数体是“小”的,则更容易/更简单地使用函数文本。如果函数体是“大的”,那么如果您将其声明为一个单独的函数并为其提供足够的文档,代码将更易于阅读和理解

一个有趣的/相关的主题是函数类型的变量,您可以使用函数文本或声明的函数初始化该变量。它的优点是它是一个标识符,因此您可以引用它,并且它的值可以更改,并且可以为它分配一个新函数

例如:

func do() { fmt.Println("Doing...") }

var f = do

func main() {
    f()
    f = func() { fmt.Println("Not doing!") }
    f()
}
以上内容的输出(在上尝试):


对于在测试中模拟函数非常有用。例如,请参阅。

如果声明了包范围的变量或函数,则它可以在包中的任何其他位置使用(如果导出了该变量或函数,则可以在包外部使用),即使在声明之前使用它也是如此。但是,JavaScript的细节不适用于Go。@Gavin您的解释很好,但它是否具有与函数声明相同的功能?太好了!所以如果我能说,这一切都是关于简单,对吗?我认为这是关于简单,表达和紧凑。
Doing...
Not doing!