Golang学习笔记_03——匿名函数和闭包
Golang测试功能应用
Golang学习笔记_01——包
Golang学习笔记_02——函数
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 := 0
increment := func() int {
counter += 1
return 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_demo
import (
"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_demo
import "testing"
func Test_AnonymousFunctionDemo(t *testing.T) {
AnonymousFunctionDemo()
}
// closure_demo.go
package function_demo
import "fmt"
func closure_demo() {
counter := 0
increment := func() int {
counter += 1
return counter
}
fmt.Println(increment())
fmt.Println(increment())
fmt.Println(increment())
}
// closure_demo_test.go
package function_demo
import "testing"
func Test_closure_demo(t *testing.T) {
closure_demo()
}
原文地址:https://blog.csdn.net/LuckyLay/article/details/144389317
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!