閉鎖golangの古典的な例

転送の説明リンク
https://www.golangtc.com/t/50d07e11320b521f59000012

クロージャはあまりないことで、開発に使用されるが、それでもためのプログラミングの意義は役に立ち理解しながら
バージョン1:

package main

import "fmt"

func main() {

    var fn [10]func()

    for i := 0; i < len(fn); i++ {
        fn[i] = func() {
            fmt.Println(i)
        }
    }

    for _, f := range fn {
        f()
    }
}

結果は以下の通りであります:

10
10
10
10
10
10
10
10
10
10

分析:ミアン()及びFUNC()[] iが主な機能変数を終了しない同じ変数を使用して閉鎖から成るアレイは、私は、F()は、この時、私は10である変数で実行される印刷文を呼び出し存在します。バージョン2:

package main

import "fmt"

func main() {

    var fn [10]func()

    for i := 0; i < len(fn); i++ {
        fn[i] = func() {
            fmt.Println(i)
        }
    }

    for i := 0 ; i < len(fn); i++ {
        fn[i]()
    }
}

結果は以下の通りであります:

10
10
10
10
10
10
10
10
10
10

分析:比較可変反復としての使用に示すバージョン1 I、反復iと異なるメモリにI点で閉鎖空間を呼び出す(生活空間とは異なる)ので、印刷空間としてクロージャの使用は、10 Iであります。バージョン3:

package main

import "fmt"

func main() {

    var fn [10]func()

    for i := 0; i < len(fn); i++ {
        fn[i] = func() {
            fmt.Println(i)
        }
    }

    for j := 0 ; j < len(fn); j++ {
        fn[j]()
    }
}

結果は以下の通りであります:

10
10
10
10
10
10
10
10
10
10

分析:反復変数、同じの10 4印刷版としてJを使用して、文の解析のバージョン2を実証するために:

package main

import "fmt"

func main() {

    var fn [10]func()
    var i int

    for i = 0; i < len(fn); i++ {
        fn[i] = func() {
            fmt.Println(i)
        }
    }

    for i = 0; i < len(fn); i++ {
        fn[i]()
    }
}

結果は以下の通りであります:

0
1
2
3
4
5
6
7
8
9

分析:メインでは()、2回の反復が同じ変数iを使用してI main()関数の生活空間を拡張するために、この時点で変数iを宣言します。したがって、第2の反復において、反復の電流値iが印刷パラメータとして使用されます。バージョン5:

package main

import "fmt"

func main() {

    var fn [10]func()

    for i := 0; i < len(fn); i++ { 
        fn[i] = make_fn(i)
    }

    for _, f := range fn {
        f()
    }
}

func make_fn(i int) func() {
    return func() {
        fmt.Println(i)
    }
}

結果は以下の通りであります:

0
1
2
3
4
5
6
7
8
9

分析:main()関数は、個々の外側のクロージャ関数で定義され、クロージャは、別個の、異なるFUNCを()[]異なるFUNC()単離を構成します。有意性は、隔離され、Aは、内部状態変更通知を設定してはならない状態変化の系列であり、独立した閉鎖を外部に表示されます。バージョン6:

package main

import "fmt"

func main() {

    var fn [10]func(int)

    for i := 0; i < len(fn); i++ { 
        fn[i] = make_fn()
    }

    for i, f := range fn {
        f(i)
    }
}

func make_fn() func(i int) {
    return func(i int) {
        fmt.Println(i)
    }
}

結果は以下の通りであります:

0
1
2
3
4
5
6
7
8
9

分析:これは最終版では使用例の表現であるの閉鎖をgotour、最高でなければなりません。

おすすめ

転載: www.cnblogs.com/hirampeng/p/11279898.html