首页 > 其他分享 >Golang基础-闭包

Golang基础-闭包

时间:2023-02-20 21:34:46浏览次数:35  
标签:闭包 函数 基础 Golang 返回值 n1 n2 变量

func fib() func() int {
	var n1, n2 int

	return func() int {
		if n1 == 0 && n2 == 0 {
			n1 = 1
		} else {
			n1, n2 = n2, n1 + n2
		}
		return n2
	}
}

next := fib()
for i := 0; i < N; i++ {
  fmt.Printf("F%d\t= %4d\n", i, next())
}
  • First class functions(Go语言中函数是一等公民,函数就像变量,可以赋值,传参,作为返回值)
  • 上面的函数的返回值是一个函数(将函数想象成一种类型)
  • “闭包”,意思是它是完整独立的,仅仅依靠调用时参数求值,不再依赖调用时的上下文
  • 函数是没有状态的,加入了闭包以后就变成有状态的了,相对于一个有成员变量的类实例来说,闭包中的状态值不是自己管理,可以认为是『上帝』在管理
  • 闭包就像一个行走的对象

观察上面的函数,其实只有两条语句,第一条声明了两个变量n1和n2,第二条返回了一个函数。重要的是这个作为fib返回值的函数的返回值是该条返回语句之前声明的变量。说起来有点绕。本来n1和n2在函数返回之后应该释放,但是返回的匿名函数的返回值又需要这俩变量,所以不能释放。所以导致的结果就是,这两个变量没有被释放,被存起来了,并且随着闭包函数的执行而改变。
fib函数创造了一个函数next,将next想象成一个拥有n1, n2成员变量的对象。

标签:闭包,函数,基础,Golang,返回值,n1,n2,变量
From: https://www.cnblogs.com/roadwide/p/17138986.html

相关文章

  • 代码随想录-链表基础
    链表链表基础单链表代码随想录(programmercarl.com)packagecom.lee;/***@authorJun*@date2023/2/1721:53*@descriptionListNode*/publicclass......
  • Acwing语法基础
    862.三元组排序-AcWing题库#include<iostream>#include<algorithm>#include<string>usingnamespacestd;structTriple{intx;floaty;stringz;......
  • 【牛客】1 基础语法
    VL1 四选一多路器`timescale1ns/1nsmodulemux4_1(input[1:0]d1,d2,d3,d0,input[1:0]sel,output[1:0]mux_out);//*************code***********//assignmux......
  • Linux命令行基础
    1.Linux命令基础知识:Linux的GUI与CLIGUI是图形用户界面CLI是命令行界面为什么要使用Linux命令行?命令行更高效:Linux系统中使用键盘操作速度要比鼠标更快。图形化界面......
  • API测试基础之http协议
    http简介:http(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP(传输控制协议)之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应......
  • 通过golang编写并发程序监控系统中文件大小并通过prometheus告警
    packagemainimport("fmt""io/ioutil""os""path/filepath""sync")const(maxFileSizeint64=10*1024*1024m......
  • 3、基础的数据结构
    1、单链表publicclassNode{publicintval;publicNodenext;publicNode(intvalue){this.val=value;}}1.1、单链表反转1.2、......
  • Java基础知识(23)- Java虚拟机(JVM)- (2) | 常用的 JVM 性能调优监控工具
    在企业级Java应用开发中,Java程序运行过程中会经常遇到内存不足、内存泄露、线程死锁、CPU高占用等问题。部分问题在日常开发中可能会被忽视或被别变通的方法绕开(比如重......
  • golang中的GPM(用户态的线程池)
     全局队列(GlobalQueue):存放等待运行的G。P的本地队列:同全局队列类似,存放的也是等待运行的G,存的数量有限,不超过256个。新建G’时,G’优先加入到P的本地队列,如果......
  • Golang基础-正则表达式
    backticksWhenusingbackticks(`)tomakestrings(Rawstringliterals),backslashes(\)don'thaveanyspecialmeaninganddon'tmarkthebeginningofspecial......