go语言学习之闭包函数
package main
import (
"fmt"
)
// 匿名函数1
func intSeq() func() int{
var arrInt = [10]int{1,2,3,4,5,6,7,8,9,10}
i := -1
return func() int{
i += 1
return arrInt[i]
}
}
// 带参数匿名函数2
func intSeq2() func(index int) int{
var arrInt = [10]int{0,1,2,3,4,5,6,7,8,9}
i := -1
return func(index int) int{
i += 1
return arrInt[index]
}
}
func testIntSeq(){
nextInt := intSeq()
fmt.Println(nextInt())
fmt.Println(nextInt())
}
func testIntSeq2(){
nextInt := intSeq2()
fmt.Println(nextInt(2))
fmt.Println(nextInt(5))
}
func testQuestion(){
var j int = 5
a := func() (func()){
var i int = 10
return func() {
fmt.Println(i, j)
}
}
b := a()
b()
}
func testQuestion2(){
var j int = 5
a := func() (func()){
var i int = 10
return func() {
fmt.Println(i, j)
}
}()
a()
}
func Question3() []func() {
b := make([]func(), 3, 3)
for i := 0; i < 3; i++ {
b[i] = func() {
fmt.Println(i)
}
}
return b
}
// 闭包通过引用的方式使用外部函数的变量。
// 上例中只调用了一次函数B,构成一个闭包,i 在外部函数B中定义,所以闭包维护该变量 i ,c[0]、c[1]、c[2]中的 i 都是闭包中 i 的引用。
// 因此执行c:=Question3()后,i 的值已经变为3,故再调用c[0]()时的输出是3而不是0。
func testQuestion3(){
c := Question3()
c[0]()
c[1]()
c[2]()
}
func Question4() []func() {
b := make([]func(), 3, 3)
for i := 0; i < 3; i++ {
b[i] = (func(j int) func() {
return func() {
fmt.Println(j)
}
})(i)
}
return b
}
// 通过嵌套匿名函数的方式解决了testQuestion3的问题
func testQuestion4(){
c := Question4()
c[0]()
c[1]()
c[2]()
}
func main(){
// 测试1匿名函数1
testIntSeq();
// 测试2带参数匿名函数
testIntSeq2();
// 测试3
testQuestion();
// 测试4
testQuestion2();
// 测试5
testQuestion3();
// 测试6
testQuestion4();
}