1. 程式人生 > >go語言學習之閉包函數

go語言學習之閉包函數

for test 執行c bsp () 執行 ack fun 在外

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(); }

go語言學習之閉包函數