Golang入门笔记(10)—— 闭包 closure

news2025/7/28 5:54:39

        先看一段代码,脱离代码讲闭包,太干了。

package main

import "fmt"

func main() {
	a := Adder()
	fmt.Println(a(1))
	fmt.Println(a(2))
	fmt.Println(a(3))
}

func Adder() func(int) int { // 累加器:这里从10开始累加
	var sum int = 10
	return func(x int) int {
		sum = sum + x
		return sum
	}
}

       主要看这里的Adder 函数 部分,这里面有2个函数,大的函数Adder 包了一个内部的匿名函数。我们来这个两个函数起一个小名好了,外面大一点的我们叫他outer,里面的匿名函数,我们就叫他inner。

        现在的情况是:outer 外部函数 返回了inner内部函数,在outer调用完成后,inner被main中的a变量接住了,我们同时发现 inner 使用了outer函数的局部变量地址指针一直没有消亡。       

         对于这种代码现象就是一个的closure。

        使用时发现的情况时:a(1),a(2),a(3) 发现 每次 sum的值都是从前一个a函数基础上得到sum值进行累加的,而不是回到10进行累加的。

        Outer中的局部变量sum,不会随着outer的返回而从栈上销毁它。相反,它会一直保留着sum保存的堆地址的指针,并会一直等待着我们去使用它。

        非要我说个原因的话,我就尝试解说一通:

        由于Adder() 执行完毕返回了一个匿名函数,把其赋值给了变量a,由于a引用了该匿名函数,正是由于a的持有,则匿名函数使用到的局部变量sum ,就不该随着adder 执行完毕就消亡,即sum变量不死 ,所以sum变量中保存的堆堆地址空间就一直存在。

        对于闭包的如何分析:

        主要要看返回的函数,它引用了哪些局部变量,这些局部变量和返回的函数共同构成了我们的闭包整体。  

        可以把闭包当成Java中的类,而sum局部变量就是字段,返回的函数 和 字段 sum 一起构成了类。

       刚刚接触GO的第三天,水平有限,如果真的讲的有问题,欢迎留言,互相进步,共同学习。

         虽是一家之言,也希望你有所收获,加油!

       

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/16446.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux时区相关

背景:用linux自带的时间接口函数读取时间的时候,发现有时候时间与北京时间不符合,经过研究发现:时间 UTC时间时区带来的偏移。操作方法:timedatectl list-timezones可看支持的时区改时区方法有如下两种: l…

【LeetCode 每日一题】15. 三数之和

01 题目描述 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元…

【数据结构】链表LinkedList

1.ArrayList的缺陷 2.单链表的实现 3.LinkedList的使用(模拟实现) 我们之前介绍过ArrayList了,它的底层是数组,数组是一段连续的空间,当我们想要插入或者删除数据的时候,插入元素,就要让插入位置…

用树莓派PICO做一个桌面时钟超详细教程!

用树莓派PICO做一个可显示时间和温湿度的桌面时钟一、概述二、材料准备1、树莓派PICO2、DHT11温湿度传感器3、DS1302时钟模块(选用)4、SSD1306屏幕5、其他材料三、开始1、连线2、写程序(1)使用内置RTC函数实现的时钟(2…

2.11 教你一套怎么建立自己的选题素材库的方法【玩赚小红书】

一、自身定位延伸选题库 建立选题库,前提先确定自身定位,然后发散性思维延展。如我们做母婴博主,接下来就要想,母婴用户会关注什么,自然会想到到宝宝吃喝玩乐、妈妈保养、产后修复、婆媳关系等等内容。若我们只做宝宝…

这才是,真彩虹预染蛋白Markers

做WB的小伙伴都知道,现市面上各种“多彩”Marker的产品有很多,但是真正拿到手上的,可能是各种各样的(见图1),咱也不清楚哪个是真的... 现在小编告诉你,经典的彩虹Marker长这样(见图2)&#xff1…

WebDAV之葫芦儿·派盘+读出通知

读出通知 支持webdav方式连接葫芦儿派盘。 手机各种推销通知太多,如何避免那些繁琐的通知内容,做出一键就能够阅读重要通知的最佳体验,帮助您更加快速和便捷的体验到那些应用内容?推荐大家使用读出通知。 读出通知APP可以设置接收通知的app,还可以用耳机操作,操作简单…

avalanche 少量tcp长连接持续构建HTTP请求测试

最近测试项目,测试要求使用少量tcp长连接连接,持续打HTTP请求,到测试结束。 分别用思博伦测试仪和supernova测试仪进行实现。 思博伦测试仪实现 测试仪基本运行流程:Loads配置任何形式bandwidth,connection&#xf…

SpringBoot项目本机和Linux环境部署

文章目录一. 本机环境下打包与运行二. Linux下部署SpringBoot项目2.1 Linux环境配置2.2 配置数据库2.3 运行程序一. 本机环境下打包与运行 项目进行打包 2. 本机环境下运行SpringBoot程序 控制台进入SpringBoot项目jar包所在的文件夹,运行下面指令即可 java -jar […

[附源码]java毕业设计企业招标系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

JDBC技术

JDBC 一、jdbc的概述 JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,(java.sql,javax.sql)使用…

第十一周周报

学习目标: DDPM 学习内容: DDPM代码 学习时间: 11.13-11.18 学习产出: 一、DDPM 1、trainer trainer用来计算损失,即将图片加噪后计算损失,损失公式如下: extract()函数:…

基于HASM模型的土壤高精度建模matlab仿真

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 一、理论基础 二、核心程序 三、测试结果 一、理论基础 土壤有机碳库是陆地生态系统中最丰富的碳库,其动态变化和存储分布在土壤质量评估、农田生态管理和气候变化适应与减缓等领域起着至关…

Java实现图书管理系统

作者:~小明学编程 文章专栏:JavaSE基础 格言:目之所及皆为回忆,心之所想皆为过往 今天给大家带来的是用Java实现的图书管理系统。 目录 需求 图书类 创建图书类 创建书架 Operation IOperation接口 添加图书AddOperation…

easyrecovery15最新版数据恢复类软件测评

当下如今,利用笔记本进行学习和办公已经是毋庸置疑的了,所以会需要在电脑上保存大量的数据信息,但是电脑在带来方便的同时,也存在很多的隐患。万一数据丢失了,该怎么办呢?要解决数据丢失问题,就…

VUE3 中实现拖拽和缩放自定义看板 vue-grid-layout

Vue Grid Layout官方文档 Vue Grid Layout中文文档 1. npm下载拖拽缩放库 npm install vue-grid-layout3.0.0-beta1 --save 2. vue3 使用 vue-grid-layout报错:external_commonjs_vue_commonjs2_vue_root_Vue_default.a is not a constructor 解决方案: vue3版本…

力扣刷题(代码回忆录)——数组部分

数组 数组过于简单,但你该了解这些!数组:二分查找数组:移除元素数组:序数组的平方数组:长度最小的子数组数组:螺旋矩阵II数组:总结篇704. 二分查找 给定一个 n 个元素有序的&#…

什么是MQ

MQ概述 MQ全称 Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于分布式系统之间进 行通信。 分布式系统之间进行通信: 远程调用:各系统间直接通过远程调用的方式; 借助第三方完成系统…

【GlobalMapper精品教程】019:基于DSM提取离散随机点的高程信息

本文讲解在globalmapper中,基于DSM提取离散随机点的高程信息,配套数据为data019.rar。 文章目录 1. 离散点创建2. 提取离散点高程信息3. 高程标注1. 离散点创建 本文在ArcGIS中,根据给定的范围,随机生成离散点,如下图: 拓展阅读: ArcGIS根据范围创建随机点教程:【ArcG…

关于Kdo N3,1380099-68-2,3-脱氧-D-甘露-辛酸(Kdo)相关物理化学知识了解下

基础产品数据(Basic Product Data): CAS号:1380099-68-2 中文名:2-酮基-3-脱氧辛酸叠氮糖 英文名:Kdo Azide,Kdo N3 结构式(Structural): 试剂基团反应特点&a…