开发者学堂课程【Go语言核心编程 - 基础语法、数组、切片、Map:闭包的基本介绍】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/625/detail/9607
闭包的基本介绍
内容介绍:
一、介绍
二、案例演示
一、介绍
1.闭包就是一个函数和与其相关的引用环境组合的一个整体(实体)。闭包的本质是一个函数,但是这个函数会用到函数外的一些变量,共同组成一个整体,这个整体就是闭包。
2.做开发的时经常需要用到闭包。
二、案例演示
1、新建一个文件 main.go,func main主函数,累加器。
用一个变量接收 AddUpper,返回一个函数。
package main
import (
"fmt"
)
//累加器
func Addupper() func (int) int f
var n int = 10
return func (x int) int i
n = n+x
return n
}
}
func main() {
//使用前面的代码f := Addupper(
fmt.Print
l
n(f(1))//11
fmt.Print
l
n(f(2))//13
fmt.Print
l
n(f(3)
)
/ 1
6
}
如果输出fmt.Println(f(1))中的1改成2会输出13
2、对上面代码的说明和总结
1.AddUpper 是一个函数,返回的数据类型是 fun (int) int
2.闭包的说明
var n int = 10 这段代码准确的说就是闭包,返回的是一个函数。
var n int = 10
return func (x int) int i
n = n+x
return n
}
返回的是一个匿名函数,但是这个匿名函数引用到函数外的n,因此这个匿名函数和n形成一个整体,构成闭包。
3.闭包是类,函数是操作,n是字段。函数和它使用到n构成闭包。
4.当反复的调用f函数时,因为n是初始化一次,因此每调用一次就进行累计。
5.闭包的关键,就是要分析出返回的函数它使用(引用)到哪些变量,因为函数和它引用到的变量共同构成闭包。分析清楚后就理解了函数和哪些变量构成了闭包。闭包本质就是函数和它引用的类型构成一个整体,当它反复调用时,它引用的变量不会每次都初始化,而是不停的累加。
6.对上面代码的一个修改,加深对闭包的理解
//累加器
func Addupper(
)
func (int) int {
var n int = 10
var str = "hello”
return func (x int) int {
n= n+ x
str +=string(36)
/
/ =>36 ='$'
fmt.Print
l
n( "str=", str)//
1.str="hello$
"
str="hello$$”3. str="hello$$$"
return n
}
}
func main() {
//使用前面的代码
f := Addupper(
)
fmt.Print
l
n(f(1))// 11
fmt.Print
l
n(f(2))// 13
fmt.Print
l
n(f(3))// 16
}
写一个 str 初始化 hello,当第一调用时输出11,第一次调用是 str=”hello1”,第二次调用会输出 str=”hello2”,第三次在后面加了个3。返回的函数和外面引入的变量共同构成一个闭包,当每次调用闭包时,变量不会再初始化,而是在原先的基础上变化,因为它们是一个整体。
问:为什么会出现这种字符?
答:因为整数1会转成 ascis 码。str +=string(36)对应的字符是$。