株式会社ヴァンデミックシステム

Blog

<スポンサーリンク>

チャネル

パッケージ メイン

 「fmt」をインポート

// Slieceとチャネルを扱う関数
FUNC  gorooutine1 S  [] INT  C  ちゃん INT  { 
    合計 :=  0 
    のため _  V  :=  範囲 S  { 
         + =  V 
    } 
    // < -チャネルに送信
    C  < -  合計
}

FUNC  メイン() { 
    S  :=  [] INT { 1  2  3  4  5 } 
    //チャネル整数を扱う
    C  :=  メイクチャン INT 
    行く gorooutine1 S  Cの
    // < - Cでチャネルから受け取るまで待機
    x  :=  < -c 
    fmt Println x 
}

15

キューのような使い方

  • 2つのチャンネルを並列実行しても2つの処理の実行を待つ
パッケージ メイン

 「fmt」をインポート

// Slieceとチャネルを扱う関数
FUNC  gorooutine1 S  [] INT  C  ちゃん INT  { 
    合計 :=  0 
    のため _  V  :=  範囲 S  { 
         + =  V 
    } 
    // < -チャネルに送信
    C  < -  合計
}

FUNC  gorooutine2 S  [] INT  C  ちゃん INT  { 
    合計 :=  0 
    のため _  V  :=  範囲 S  { 
         + =  V 
    } 
    // < -チャネルに送信
    C  < -  
}

FUNC  メイン() { 
    S  :=  [] INT { 1  2  3  4  5 } 
    //チャネル整数を扱う
    C  :=  メイクチャン INT 
    行く gorooutine1 S  C 
    に行く gorooutine2をS  C 
    // <-cでチャネルから受け取るまで待機
    x  :=  < -c 
    fmt Println x 
    y  := < -c 
    fmt Println y 
}
15
15

バッファ付きチャネル

パッケージ メイン

 「fmt」をインポート

func  main () { 
    ch  :=  make chan  int  2 
    ch  <  -100 
    fmt Println len ch ))
    ch  <  -200 
    fmt Println len ch ))
    // rangeで
    後続場合はcloseしないと次のChannelを呼ぼうとしてエラーになるclose ch 

    // forで1つづつルーティング
    for  c  :=  range  ch  { 
        fmt Println c 
    } 
}
1
2
100
200

チャネルの範囲、閉じる

パッケージ メイン

 「fmt」をインポート

FUNC  goroutine1 S  [] INT  C  ちゃん INT  { 
    合計 :=  0 
    のため _  V  :=  範囲 S  { 
         + =  V 
        C  < -  
    } 
    //処理完了後は近くを入れる
    近いC 
}

FUNC  メイン() { 
    S  :=  [] INT { 1  2  3  4  5 } 
    、C  :=  メイクチャン INT  lenのS ))
    に行く goroutine1 S  C 
    //チャネルを1回ずつ呼び出します
    for  i  :=  range  c  { 
        fmt Println i 
    } 
}
1
3
6
10
15

プロデューサーコンシューマー

パッケージ メイン

インポート 
    "fmt" 
    "sync" 
    "time" 


func  プロデューサーch  chan  int  i  int  { 
    //何か
    ch  <  -i  *  2 
}

FUNCの 消費者CH  ちゃん INT  WG  * 同期WaitGroup  { 
     I  :=  レンジ CH  { 
        FUNC () { 
            FMT Println "process"  i * 1000 
            wg 完了()
        }()
    } 
    fmt Println "#################################" 
}

func  main () { 
    var  wg  sync WaitGroup 
    ch  :=  make chan  int 

    //プロデューサー
    for  i  :=  0 ;  i  <  10 ;  i ++  { 
        wg add 1 
        go  プロデューサーch  i 
    }

    //消費者
    、外出先の 消費者CH  WG 
    WG 待機()
    クローズch 
    時間スリープ2  *  時間
    fmt Println "完了" 
}
プロセス0
プロセス4000
プロセス2000
プロセス6000
プロセス8000
プロセス10000
プロセス12000
プロセス14000
プロセス16000
プロセス18000
#################################
できた

ファンアウトファンイン

パッケージ メイン

 「fmt」をインポート

func  producer first  chan  int  { 
    defer  close first 
    for  i  :=  0 ;  i  <  10 ;  i ++  { 
        最初 <  -i 
    } 
}

func  multi2 first  chan  int  second  chan  int  { 
    defer  close second 
    for  i  :=  range  first  { 
        // 1 * 2 = 2 
        // 2 * 2 = 4 
        second  <  -i  *  2 
    } 
}

func  multi4 second  chan  int  third  chan  int  { 
    defer  close third 
    for  i  :=  range  second  { 
        // 2 * 4 = 8 
        // 4 * 4 = 4 
        third  <  -i  *  4 
    } 
}

func  main () {

    最初 :=  make chan  int 
    2番目 :=  make chan  int 
    3番目 :=  make chan  int 

    go  プロデューサー最初
    go  multi2 最初 2番目
    go  multi4 2番目 3番目
    for  result  :=  range  third  { 
        fmt Println 結果
    } 
}
0
8
16
24
32
40
48
56
64
72

選択する

パッケージ メイン

インポート 
    "fmt" 
    "time" 


func  goroutine1 ch  chan  string  { 
    for  { 
        ch  <-  "packat from 1" 
        time スリープ3  *  時間
    } 
}

func  goroutine2 ch  chan  string  { 
    for  { 
        ch  <-  "packat from 2" 
        time スリープ1  *  時間
    } 
}

func  main () { 
    c1  :=  make chan  string 
    c2  :=  make chan  string 
    go  goroutine1 c1 
    go  goroutine2 c2 

    以下のために { 
        選択 { 
        ケース MSG1  =  - < C1 
            FMTをprintln MSG1 
        場合 MSG2  :=  < - C2 
            FMT Println msg2 
        } 
    } 
}
1からのpackat
2からのpackat
2からのpackat
2からのpackat
1からのpackat
2からのpackat
2からのpackat
2からのpackat

デフォルトセクション

パッケージ メイン

インポート 
    "fmt" 
    "time" 


func  main () { 
    tick  :=  time ティック100  *  時間ミリ秒
    ブーム :=  時間500  *  時間ミリ秒

    以下のために { 
        選択 { 
        // 100Millisocond毎
        場合 - < ダニ
            FMTをprintln "ダニ" 
            // 500Millisocond毎
        場合 < - ブーム
            FMT Println "BOOM" 
            // loop終了
            return 
            //それ以外は
        ピリオドデフォルト
            fmt Println "。" 
            時間スリープ50  *  時間ミリ秒
        } 
    } 
}
    。
    。
ダニ、
    。
    。
ダニ、
    。
    。
ダニ、
    。
    。
ダニ、
    。
    。
ダニ、
ブーム

<スポンサーリンク>

コメントを残す

Allowed tags:  you may use these HTML tags and attributes: <a href="">, <strong>, <em>, <h1>, <h2>, <h3>
Please note:  all comments go through moderation.

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)