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

news/2024/12/12 21:49:06/

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()
}

http://www.ppmy.cn/news/1554592.html

相关文章

无人机飞手考证后从事吊运植保创业技术详解

无人机飞手考证后从事吊运植保创业的技术详解如下: 一、无人机飞手考证流程 1. 报名与资格审核: 选择正规培训机构,提交身份证明、学历证明等相关材料。 通过初步审核,确保学员满足年龄(年满16周岁)、身…

UPLOAD-LABS靶场[超详细通关教程,通关攻略]

---------------------------------------- 靶场环境: 下载链接: https://codeload.github.com/c0ny1/upload-labs/zip/refs/heads/master 使用小皮集成环境来完成这个靶场 将文件放到WWW目录下就可以进行访问 ------------------------------------…

docker 拉取镜像报错: missing signature key解决-以Minio为例

摘要 遇到 missing signature key 错误时,问题通常是 Docker 客户端版本较旧导致的签名验证失败。通过更新 Docker 版本可以快速解决问题。如果更新过程中遇到问题,可参考相关教程进行卸载重装。 一、报错信息 平平无奇的下午,心血来潮&am…

css 权重

发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。 CSS 权重(或称为 CSS 优先级)决定了当多个 CSS 规则作用于同一元素时,哪一条规则会被应用。…

输入url到显示主页的详细过程

从浏览器地址输入url到显示主页的过程? 主要分为:DNS解析,TCP连接,发送HTTP请求,服务器处理请求,浏览器接收HTTP响应,断开连接 DNS解析: 浏览器发起一个DNS请求到DNS服务器&#…

fastadmin框架同时使用 阿里云oss和阿里云点播

背景 项目的实际需求中既要用到阿里云oss产品又用到阿里云点播系统&#xff0c;实现完美的统一。设置两个地址downUrl&#xff0c;thirdCode。分别代表阿里云oss上传路径和阿里云点播系统vId。 实现 默认框架你已经集成好阿里云oss集成工作&#xff0c;前端html页面实现 <…

MySQL Binlog 日志监听与 Spring 集成实战

MySQL Binlog 日志监听与 Spring 集成实战 binlog的三种模式 MySQL 的二进制日志&#xff08;binlog&#xff09;有三种常见的格式&#xff1a;Statement 模式、Row 模式和Mixed 模式。每种模式的设计目标不同&#xff0c;适用于不同的场景&#xff0c;以下是它们的详细对比和…

【通俗理解RNN】

1.从单层网络到经典的RNN结构 首先要了解一下最基本的单层网络&#xff0c;它的结构如下图所示&#xff1a; 输入是x&#xff0c;经过变换Wxb和激活函数f&#xff0c;得到输出y。 在实际应用中&#xff0c;我们还会遇到很多序列形的数据&#xff1a; 如&#xff1a; 自然语…