当前位置: 首页 > java >正文

理解Go与Python中的闭包(Closure)

在现代编程中,函数不仅仅是执行某段代码的工具,更是可以作为值传递和返回的“第一等公民”。其中,闭包(Closure)是一个非常强大的概念,它允许函数“捕获”并“记住”定义时的环境变量,即使在该环境已经结束之后,依然可以访问这些变量。

本文将带你了解Go和Python中的闭包是什么,以及它们的基本用法。

什么是闭包?

闭包是指一个函数定义在另一个函数内部,并且内部函数引用了外部函数的变量。即使外部函数已经返回,内部函数依然可以访问这些变量。这种“捕获”外部环境变量的能力,使得闭包可以拥有自己的私有状态。

Python中的闭包

在Python中,定义在函数内部的函数可以捕获外部函数的变量,形成闭包。即使外部函数已经返回,内部函数依然可以访问这些变量。

示例

def outer(x):def inner(y):return x + y  # inner捕获了外部变量xreturn inneradd_five = outer(5)
print(add_five(10))  # 输出15

在这个例子中,inner是一个闭包,它“捕获”了外部函数outer中的变量x。即使outer已经结束,inner仍然可以访问x

Go中的闭包

在Go中,匿名函数(函数字面量)可以访问定义时的环境变量,形成闭包。这种特性常用于创建带有私有状态的函数。

示例

package mainimport "fmt"func makeCounter() func() int {count := 0return func() int {count++return count}
}func main() {counter := makeCounter()fmt.Println(counter()) // 输出1fmt.Println(counter()) // 输出2
}

这里,匿名函数“捕获”了count变量,形成了一个闭包。每次调用counter()count的值都会增加,保持状态。

总结

  • 定义:闭包是可以“捕获”其定义环境中的变量的函数。
  • 特性:使函数拥有“记忆”状态,可以在不同调用间保持变量值。
  • 应用场景:实现私有变量、函数工厂、回调等。

理解并掌握闭包的概念,可以让你写出更灵活、更高效的代码。不论是Python还是Go,闭包都是函数式编程的重要组成部分。希望这篇博客能帮你更好理解闭包的原理与用法!

http://www.xdnf.cn/news/19926.html

相关文章:

  • 充电枪结构-常规特征设计
  • 代码随想录刷题Day48
  • PostgreSQL 索引使用分析2
  • 权威认证!华宇TAS应用中间件获得商用密码产品认证证书
  • 深入解析Go语言切片(Slice)精髓
  • 【论文阅读】LightThinker: Thinking Step-by-Step Compression (EMNLP 2025)
  • 金额字段该怎么设计?——给小白的超详细指南(含示例 SQL)
  • UniApp 混合开发:Plus API 从基础到7大核心场景实战的完整指南
  • 一文吃透 Protobuf “Editions” 模式从概念、语法到迁移与实战
  • 自动化仓库托盘搬运减少错误和损坏的方法有哪些?实操案例解读
  • 【踩坑记录】Unity 项目中 PlasticSCM 掩蔽列表引发的 文件缺失问题排查与解决
  • 分割回文串手绘图
  • 【OpenGL】LearnOpenGL学习笔记19 - 几何着色器 Geometry Shader
  • 解决 Android Studio 中 build 目录已被 Git 跟踪后的忽略问题
  • 【stm32】定时器中断与定时器外部时钟
  • el-table 行高亮,点击行改变背景
  • CVE-2025-6507(CVSS 9.8):H2O-3严重漏洞威胁机器学习安全
  • 安全测试漫谈:如何利用X-Forwarded-For头进行IP欺骗与防护
  • TDengine NOW() 函数用户使用手册
  • Ubuntu环境下的 RabbitMQ 安装与配置详细教程
  • RabbitMQ篇
  • 20250903的学习笔记
  • LangChain实战(十三):Agent Types详解与选择策略
  • 动态IP和静态IP配置上有什么区别
  • 单片机控制两只直流电机正反转C语言
  • 如何保存训练的最优模型和使用最优模型文件
  • 【wpf】WPF开发避坑指南:单例模式中依赖注入导致XAML设计器崩溃的解决方案
  • SpringBoot注解生效原理分析
  • AI落地新趋势:美林数据揭示大模型与小模型的协同进化论
  • Java中 String、StringBuilder 和 StringBuffer 的区别?