首页 > 其他分享 >Go语言闭包

Go语言闭包

时间:2023-04-10 14:38:15浏览次数:37  
标签:闭包 语言 int fmt Println func Go 函数

说到Go语言的闭包,不得不说说全局变量和局部变量

全局变量的特点:
1.常驻内存
2. 污染全局
局部变量的特点:
1.不常驻内存
2.不污染全局

而Go语言的闭包可以做到

1.可以让变量常驻内存
2.可以让变量不污染全局

所以闭包主要是为了避免全局变量的滥用。

闭包
1.闭包是指有权访问另一个函数作用域中的变量的函数
2.创建闭包的常见方式就是在一个函数内部创建另一个函数, 内函数可以访问外函数的变量

注意:
闭包里作用域返回的局部变量不会被立刻销毁回收,但过度使用闭包可能会占用更多内存,导致性能下降。

例1

func adder() func()int{
i:=10
return func()int{
return i+1
}
}

func adder1() func(x int)int{
i:=10
return func(x int)int{
i=i+x
return i
}
}

func main() {
fn := adder()
fmt.Println(fn()) //11
fmt.Println(fn()) //11

fn1 := adder1()
fmt.Println(fn1(10)) //20
fmt.Println(fn1(10)) //30
}

有人形象的概括闭包就是:函数 + 引用环境 = 闭包

同一个函数与不同引用环境组合,可以形成不同的闭包实例。

例2

func addTool() func(int) int {

var n = 10

return func(x int) int {

n = n + x

return n

}

}

func main() {

f := addTool()

fmt.Println(f(1))//11

fmt.Println(f(2))//13

fmt.Println(f(3))//16

}

对例2代码的总结:

addTool是一个函数,返回的数据类型是func(int)int
绿色代码就是闭包,返回的是一个匿名函数,但是这个匿名函数引用到函数外面的n,因此这个匿名函数就和n形成一个整体,构成闭包。
大家可以这样理解:闭包是类,函数是操作,n是字段,函数和他使用的变量构成闭包
当我们反复调用f函数时,因为n是初始化一次,因此每调用一次就进行累计。
我们搞清楚闭包的关键就是分析出返回的函数和他引用到哪些变量。
————————————————
版权声明:本文为CSDN博主「编程之路」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_27654007/article/details/116667624

标签:闭包,语言,int,fmt,Println,func,Go,函数
From: https://www.cnblogs.com/golandhome/p/17302798.html

相关文章

  • Django中models模块增删改查
    1django操作数据库1.1创建表和字段fromdjango.dbimportmodelsclassBlog_Model(models.Model):name=models.CharField(db_column='name',max_length=200,blank=True,verbose_name='name')num=models.IntegerField(db_column='num�......
  • 用 Go 剑指 Offer 39. 数组中出现次数超过一半的数字 (摩尔投票)
    数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 //若不存在多数元素,本题就需要计数并判断示例 1:输入:[1,2,3,2,2,2,5,4,2]输出:2 限制:1<=数组长度<=50000来源:力扣(LeetCode)链......
  • C语言学习第五天
    打字练习软件typespeed  1、安装:sudoapt-getinstalltypespeed  2、打开typespeed保证窗口至少80*24一、Windows下获取方向键:  1、导入#include<conio.h>  2、通过getch()的返回值获取键盘上的键值    上:72 下:80 左:75 右:77二、Lin......
  • mac配置vscode和go
    一安装和配置Go去这里下载Go的安装包:https://studygolang.com/dl建议下载pkg格式,懒人安装安装完毕后用goversion验证一下是否安装成功然后使用goenv查看一下go相关的环境变量主要是查看GOROOT,GOPATH,GOBINGOPATH:GO的工作目录,这个默认是~/goGOROOT:GO的安装目......
  • #yyds干货盘点#【愚公系列】2023年04月 .NET CORE工具案例-多语言离线翻译系统
    前言1.在线翻译在线翻译,一般是指在线翻译工具,如百度翻译、阿里翻译1688或Google翻译等。这类翻译工具的作用是利用计算机程序将一种自然语言(源语言)转换为另一种自然语言(目标语言)。其原理是依托海量的互联网数据资源和自然语言处理技术,在数百万篇文档中查找各种模式,以求解最佳......
  • ChatGPT垂直行业私有数据知识库功能-咨询接口采用流式响应输出-JS和Golang实现流式响
    近期开发私有数据知识库功能,想要实现和ChatGPT聊天效果类似的逐字流式输出展示效果。GPT3.5本身就有流式聊天补全接口,后端Golang对接后,也需要能流式输出。下面就介绍下前端JS后端Golang来实现这种输出效果 大部分介绍是使用EventStream来实现,我现在不使用EventStream也来实现......
  • 2023 最新的如何树莓派上安装中文输入法和设置中文语言环境教程 All In One
    2023最新的如何树莓派上安装中文输入法和设置中文语言环境教程AllInOne亲测有效:RaspberryPi3B+RaspberryPiOS(64-bit)descscreenshotRaspberryPi3BRaspberryPiOS(64-bit)https://www.cnblogs.com/xgqfrms/p/17300085.html#5166108操作步骤......
  • 用 Go 剑指 Offer 42. 连续子数组的最大和
    输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 示例1:输入:nums=[-2,1,-3,4,-1,2,1,-5,4]输出:6解释: 连续子数组 [4,-1,2,1]的和最大,为 6。 提示:1<= arr.length<=10^5-100<=arr[i]<=100......
  • 用 Go 剑指 Offer 40. 最小的k个数 (Top K 问题)
    输入整数数组arr,找出其中最小的k个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。 示例1:输入:arr=[3,2,1],k=2输出:[1,2]或者[2,1]示例2:输入:arr=[0,1,2,1],k=1输出:[0] 限制:0<=k<=arr.length<=100000<=arr[i] <=100......
  • GO打包到linux服务器运行
    方法二:本地编译cmd控制台到main.go文件目录下setGOARCH=amd64setGOOS=linuxgobuildmain.go会生成一个没有后缀的二进制文件main将该文件放入linux系统某个文件夹下赋予权限chmod777main最后执行./main就行了。如果想让项目在后台执行:执行nohup./main&,这样......