golang的匿名函数和普通函数的区别

  • Post author:
  • Post category:golang


匿名函数是不具名的函数,可以在不定义函数名的情况下直接使用,通常用于函数内部的局部作用域中。而普通函数则是通过定义函数名,在任何地方都可以直接调用的函数。

在 Go 中,匿名函数与普通函数有以下区别:

  1. 匿名函数可以在函数内部定义,普通函数只能在包级别定义;
  2. 匿名函数可以在定义后立即调用,也可以赋值给一个变量后再调用,而普通函数只能通过函数名调用;
  3. 匿名函数可以

    访问并修改外部变量,即闭包特性

    ,而普通函数只能访问参数和全局变量;
  4. 匿名函数可以作为函数参数传递,也可以作为函数返回值,而普通函数只能作为函数参数传递。

例如,以下代码使用了匿名函数:

package main
import "fmt"
func main() {
    func() {
        fmt.Println("Hello, World!")
    }()
}
  

在这个例子中,我们定义了一个匿名函数,并在函数定义后立即调用。该匿名函数没有名称,没有参数,没有返回值,仅仅打印 “Hello, World!”。由于该函数是在 main 函数内部定义的,因此只能在 main 函数内部调用,外部无法访问。

匿名函数可以

访问并修改外部变量,即闭包特性

	s := []string{"我喜欢", "邓文怡"}
	func(){
		s[1] = "编程"
		s = append(s, "和", "写作")
	}()
	for _, v := range s {
		print(v, " ")
	}
	// 我喜欢 编程 和 写作

在这个例子中,我们定义了一个字符串切片 s,包含两个元素 “我喜欢” 和 “邓文怡”。然后定义了一个匿名函数,并在函数定义后立即调用。在该匿名函数中,我们将 s 切片的第二个元素修改为 “编程”,并将 “和” 和 “写作” 两个元素添加到 s 切片的末尾。最后,通过使用 range 循环遍历 s 切片的每个元素,并将其打印出来。因此,打印输出的结果为 “我喜欢 编程 和 写作”。值得注意的是,由于该匿名函数是在 main 函数内部定义的,因此只能在 main 函数内部调用,外部无法访问。


由于该匿名函数是在 main 函数内部定义的,因此可以访问和修改 s 切片。在该匿名函数定义时,它引用了变量 s,因此它形成了一个闭包,即该匿名函数“捕获”了在其定义范围内声明的变量 s。所以,在匿名函数中修改 s 切片的值也影响到了 main 函数中 s 切片的值。

这就是匿名函数的闭包特性:

函数可以访问并修改其定义范围内的变量。



版权声明:本文为Deng_Xian_Sheng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。