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

闭包通俗解释,Demo(Go Java Python)

闭包的概念

想象一下,你有一个包裹着变量的函数,就像是一个封闭的包裹。这个包裹里有一个变量,而这个函数(或包裹)本身就是一个完整的单元。当你把这个函数传递给其他地方,就像是把这个包裹传递出去。

这个包裹不仅包含函数的代码,还"包裹"着它的词法环境,也就是函数定义时所在的上下文,其中包含的变量。这就意味着在函数之外,你仍然可以访问和使用函数内的变量,就好像把这个包裹带到其他地方一样。这种行为就像是一个"封闭的包裹",因此被称为 "闭包"。

所以,闭包就好比是一个能够包含函数代码和其相关环境的封闭单元,而且可以在其定义的范围之外继续存在和生效。

应用场景 

闭包是有权访问另一个函数作用域变量的函数,常见方式是函数内部创建另一个函数

优点:减少代码量,使这些局部变量始终保存着内存中,避免使用全局变量

缺点:这些局部变量不会立即销毁,浪费内存

比如A函数入参有5个,在A函数的处理逻辑中还需要调用B函数和C函数,而且B函数和C函数也用到了比较多的入参,那么如果将B和C定义到了函数A之内,这些入参就可以省去,直接调用即可,

代码的可读性也比较强。

不同语言Demo

匿名函数的使用在 Go 语言中非常灵活,可以帮助简化代码结构和提高代码的可读性。

这三个示例分别演示了在Java、Python和Go中如何使用闭包来捕获外部变量并在闭包内部使用它们。闭包允许我们在不传递变量的情况下将函数及其上下文传递给其他部分,这在某些情况下非常有用。

Java:

import java.util.function.*;

public class ClosureExample {
    public static void main(String[] args) {
        int x = 10;
        
        // 使用Lambda表达式创建一个闭包
        IntSupplier closure = () -> x * 2;
        
        // 调用闭包
        int result = closure.getAsInt();
        
        System.out.println("结果:" + result);
    }
}

在这个Java示例中,我们使用IntSupplier接口创建了一个闭包 closure,它捕获了外部变量 x 的值并返回 x * 2。这个闭包可以在定义它的上下文之外使用。

Python:

def outer_function(x):
    def inner_function():
        return x * 2
    return inner_function

closure = outer_function(10)
result = closure()

print("结果:", result)

在这个Python示例中,我们定义了一个外部函数 outer_function,它接受一个参数 x,并返回一个内部函数 inner_functioninner_function 捕获了外部变量 x 的值并返回 x * 2。然后,我们通过调用 outer_function(10) 创建了一个闭包 closure,并调用它来获得结果。

Go:

package main

import "fmt"

func main() {
    x := 10
    
    // 创建一个闭包函数
    closure := func() int {
        return x * 2
    }
    
    // 调用闭包
    result := closure()
    
    fmt.Println("结果:", result)
}

在这个Go示例中,我们使用匿名函数创建了一个闭包 closure,它捕获了外部变量 x 的值并返回 x * 2。然后,我们调用闭包并打印结果。

这三个示例分别演示了在Java、Python和Go中如何使用闭包来捕获外部变量并在闭包内部使用它们。闭包允许我们在不传递变量的情况下将函数及其上下文传递给其他部分,这在某些情况下非常有用。


http://www.kler.cn/news/108161.html

相关文章:

  • winodos下使用VS2022编译eclipse-paho.mqtt.c并演示简单使用的 demo
  • pytest方法间变量值传递--request夹具
  • ajax有哪些优缺点?
  • Azure - 机器学习:使用 Apache Spark 进行交互式数据整理
  • MySQL篇---第五篇
  • SSM宾馆客房管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目
  • 基于SSM和VUE的留守儿童信息管理系统
  • vue列表新增存储假数据
  • OpenCV学习(二)——OpenCV中绘图功能
  • 【孙哥说Spring5】第三章 Spring的事务处理
  • 图解Kafka高性能之谜(五)
  • 【计算机网络笔记】DNS报文格式
  • 日常软件游戏丢失msvcp120dll怎么修复?分享5个修复方法
  • Python---使用turtle模块+for循环绘制五角星---利用turtle(海龟)模块
  • 解决国外镜像无法访问导致的R包无法安装问题
  • HDU 1062:字符串反转
  • 面向对象设计模式——命令模式
  • 17、简单记录一下两个流媒体工具和推流测试
  • springboot配置https
  • 用于读取验证码的 OCR 模型
  • 设计模式:桥接模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)
  • vue中父组件给子组件传递了参数后,什么时候确保子组件中收到的参数更新了
  • 创新领航 | 竹云参编《基于区块链的数据资产评估实施指南》正式发布!
  • 【Python机器学习】零基础掌握MissingIndicator缺失值填充
  • Node.js的基本概念node -v 和npm -v 这两个命令的作用
  • 华为数通方向HCIP-DataCom H12-831题库(多选题:101-120)
  • 2016年下半年上午易错题(软件设计师考试)
  • [100天算法】-连通网络的操作次数(day 46)
  • LVS-DR模式+keepalived+nginx+tomcat实现动静分离、负载均衡、高可用实验
  • 方舟生存进化ARK个人服务器搭建教程保姆级