自学内容网 自学内容网

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)!