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(); }
原文地址:https://www.cnblogs.com/xzlq/p/9951612.html
时间: 2024-10-24 18:57:26