欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > Golang学习笔记_03——匿名函数和闭包

Golang学习笔记_03——匿名函数和闭包

2025/7/16 18:52:48 来源:https://blog.csdn.net/LuckyLay/article/details/144389317  浏览:    关键词:Golang学习笔记_03——匿名函数和闭包

Golang测试功能应用
Golang学习笔记_01——包
Golang学习笔记_02——函数


文章目录

    • 1. 匿名函数
      • 1.1 定义
      • 1.2 语法
      • 1.3 用途
    • 2. 闭包
      • 2.1 定义
      • 2.2 特性
      • 2.3 示例
      • 2.4 注意事项
    • 3. 匿名函数和闭包
    • 源码


1. 匿名函数

1.1 定义

匿名函数,顾名思义,就是没有名称的函数。它们可以在需要函数值或函数类型的表达式中直接定义。

1.2 语法

匿名函数的语法与常规函数类似,但不包含函数名。它们通常被赋值给变量,或者作为参数传递给其他函数。

func AnonymousFunctionDemo() {sum := func(x, y int) int {return x + y}fmt.Println(sum(1, 2))divide := func(x, y int) (int, error) {if y == 0 {return x, errors.New("division by zero")}return x / y, nil}res, err := divide(100, 0)fmt.Println("res and error: ", res, err)
}

测试方法

func Test_AnonymousFunctionDemo(t *testing.T) {AnonymousFunctionDemo()
}

输出结果

=== RUN   Test_AnonymousFunctionDemo
3
res and error:  100 division by zero
--- PASS: Test_AnonymousFunctionDemo (0.00s)
PASS

1.3 用途

  • 回调函数:匿名函数常作为回调函数使用,例如在排序算法中。
  • 事件处理:在GUI编程中,匿名函数可以用于处理用户事件,如按钮点击。
  • 延迟执行:与defer关键字结合使用,可以在函数返回后执行某些清理工作。

2. 闭包

2.1 定义

闭包是指一个函数以及该函数所引用的所有外部变量的集合。闭包允许函数记住并访问其词法作用域(即定义时的环境)中的变量,即使这个函数是在其词法作用域之外执行的

2.2 特性

  • 封装状态:闭包可以封装函数执行时的状态,使得函数的行为可以根据这些状态来改变。
  • 数据隐藏:通过闭包,可以实现数据的私有性和封装性,防止外部直接访问或修改。
  • 函数工厂:闭包可以用于创建具有特定行为的函数对象,类似于函数工厂。

2.3 示例

func closure_demo() {counter := 0increment := func() int {counter += 1return counter}fmt.Println(increment())fmt.Println(increment())fmt.Println(increment())
}

测试方法

func Test_closure_demo(t *testing.T) {closure_demo()
}

输出结果

=== RUN   Test_closure_demo
1
2
3
--- PASS: Test_closure_demo (0.00s)
PASS

2.4 注意事项

  • 内存管理:由于闭包持有对其词法作用域的引用,因此如果闭包长时间存活,可能会导致其引用的变量也无法被垃圾回收。这在使用大量闭包或闭包持有大量数据时需要注意。
  • 性能:虽然闭包提供了很大的灵活性,但在某些情况下,它们可能会引入额外的性能开销。因此,在性能敏感的场景中,需要谨慎使用闭包。

3. 匿名函数和闭包

在Go语言中,匿名函数和闭包是紧密相连的。实际上,每个匿名函数都是一个潜在的闭包,只要它引用了其词法作用域中的变量。当匿名函数被调用时,如果它访问了外部变量,那么这些变量就会被捕获到闭包中,使得函数能够记住并访问它们。


源码

// anonymous_function_demo.go文件
package function_demoimport ("errors""fmt"
)func AnonymousFunctionDemo() {sum := func(x, y int) int {return x + y}fmt.Println(sum(1, 2))divide := func(x, y int) (int, error) {if y == 0 {return x, errors.New("division by zero")}return x / y, nil}res, err := divide(100, 0)fmt.Println("res and error: ", res, err)
}
// anonymous_function_demo_test.go文件
package function_demoimport "testing"func Test_AnonymousFunctionDemo(t *testing.T) {AnonymousFunctionDemo()
}
// closure_demo.go
package function_demoimport "fmt"func closure_demo() {counter := 0increment := func() int {counter += 1return counter}fmt.Println(increment())fmt.Println(increment())fmt.Println(increment())
}
// closure_demo_test.go
package function_demoimport "testing"func Test_closure_demo(t *testing.T) {closure_demo()
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词