本文共 2027 字,大约阅读时间需要 6 分钟。
a := make([]int, 3)a = append(a, 1, 2, 3)切片大小变成6
匿名函数是指不需要定义函数名的一种函数实现方式,可以直接赋值给一个变量或者直接运行
Go的匿名函数是一个闭包,闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者,任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块(由于自由变量包含,在代码块中,所以这些自由变量以及它们引用的对象没有被释放)为自由变量提供绑定的计算环境(作用域)。
闭包的价值在于可以作为函数对象或者匿名函数。
闭包的字面定义:闭包是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)。这个从字面上很难理解,特别对于一直使用命令式语言进行编程的程序员们。
闭包里变量的生命周期跟闭包变量的周期一样
Go中的闭包,一个函数和与其相关的引用环境组合而成的实体。
Go里有函数类型的变量,这样,虽然不能在一个函数里直接声明另一个函数,但是可以在一个函数中声明一个函数类型的变量,此时的函数称为闭包(closure)。
package mainimport "fmt"func getSequence() func(i int) int { sum:=0 return func(i int) int { sum = sum +i return sum }}func main(){ nextNumber := getSequence() fmt.Println(nextNumber(1)) fmt.Println(nextNumber(1)) fmt.Println(nextNumber(1)) nextNumber1 := getSequence() fmt.Println(nextNumber1(1)) fmt.Println(nextNumber1(1))}
运行结果
12312
package mainimport "fmt"func getSequence() func() int { sum:=0 return func() int { sum += 1 return sum }}func main(){ nextNumber := getSequence() fmt.Println(nextNumber()) fmt.Println(nextNumber()) fmt.Println(nextNumber()) nextNumber1 := getSequence() fmt.Println(nextNumber1()) fmt.Println(nextNumber1())}
运行结果
12312
package mainimport "fmt"func main(){ sum1 := 10 getSequence := func() func() int { sum:=0 return func() int { fmt.Println(sum1) sum += 1 return sum } } nextNumber := getSequence() fmt.Println(nextNumber()) fmt.Println(nextNumber()) fmt.Println(nextNumber()) nextNumber1 := getSequence() fmt.Println(nextNumber1()) fmt.Println(nextNumber1()) fmt.Println("end:",sum1)}
运行结果
101102103101102end: 10
转载于:https://blog.51cto.com/12880687/2130169