外出言語チャンネル(チャン) - ゴルーチン間の通信のためのパイプ
ゴルーチンは、その後、ボディランゲージ囲碁プログラムによって複雑にされている場合、チャネルは、それらの間の通信メカニズムです。通信チャネルは、他のゴルーチン値情報にそれを送信することによって、ゴルーチンを可能にする機構です。各チャネルは、特殊なタイプを有し、データチャネルのすなわちタイプを送信することができます。データチャネルを送信することができるint型は、一般にチャンintとして書き込まれます。
外出先の言語の代わりに、共有メモリ通信方法の使用を促進し、資源は、ゴルーチン間で共有されるパイプとの間に設定ゴルーチンチャネルを必要とし、データの交換を確実にするために、同期メカニズムを提供します。あなたがチャンネルを宣言するときは、共有されるデータの型を指定する必要があります。チャネルは、内蔵型、型名、基準値またはポインタ型の種類及び構造によって共有することができます。
以下に示すように、ここで本方法は、通信チャネル(チャネル)を使用することです。
図:ゴルーチンとの通信チャネル
多くの場合、地下鉄の駅、食堂、トイレやその他の公共の場所、人では、我々はキューイングの習慣を開発、目的はキューをジャンプすることにより混雑、非効率的な資源の利用と交換プロセスを避けるためです。コードとデータは、あまりにも、必然的にキューを使用して、実装の低効率が得られ競合のゴルーチンに順に複数のデータが、最も効率的な方法で、チャンネルAは、同じキュー構造です。
特性チャンネル
ゴー言語のチャンネル(チャンネル)特殊なタイプです。いつでも、それらの一方のみを送信し、データを取得するためのアクセスチャネルをゴルーチン。ゴルーチン間のチャネルを介して通信することができます。
コンベアベルトまたはチャネルキューのようには、常にFIFO(先入れ先出し)規則は、データ送受信の順序を保証従ってください。
チャネル型宣言
チャネル自体を使用すると、要素の型のようなスライスの種類を確認する必要があり、変更の種類を必要とします。チャネル要素の型は、その中に送信されるデータの種類は、次の文です。
VARチャネルちゃん変数チャネル型
- チャネルタイプ:チャンネル内のデータのタイプ。
- チャンネル変数:保存変数チャンネル。
ヌルちゃんの種類は、文の後に満たすために必要を利用するためには、nilです。
チャンネルを作成します。
チャネルが参照型である、あなたは、次の形式で、作成するのに活用する必要があります。
チャネルインスタンス:=メイク(チャンデータ型)
- データタイプ:伝送チャネル内の要素のタイプ。
- チャンネル例:メイクによって作成されたチャネルハンドル。
次の例を考えてみます。
- CH1:=メイク(ちゃんint型)//チャネルの整数型を作成します
- CH 2 =空きチャネルインタフェースタイプを作成する//(チャンインターフェイス{})を作る、それは任意のフォーマットで格納することができます
- 装備構造体を入力し、{/ *フィールドの数* /}
- CH2:=メイク(ちゃん*装備)//装備ポインタ型のチャネルを作成し、装備を保存することができます*
チャネルを使用してデータ送信
チャンネルが作成されたら、送信のためのチャネルを使用して操作を受け取ることができます。
データを送信するためのフォーマット1)チャネル
特別な演算子を使用して送信チャンネル<-
、データ形式は、チャネルを介して送信されます。
可変チャンネル< - バリュー
- チャンネル変数:makeが良好なチャネルインスタンスを作成します。
- 発見:変数、定数、式または関数の戻り値にすることができます。これは、値CHチャネル要素型の型と一致しなければなりません。
2)データの例としては、チャネルを介して送信します
メイクを使用するチャネルを作成した後、使用することができ<-
、次のように、チャネルにデータを送信するために:
- //空のインターフェースチャネルを作成します。
- CH:=メイク(チャンインターフェイス{})
- チャンネルに// 0
- CH < - 0
- チャンネル内の//ハロー文字列
- CH < - "こんにちは"
3)連続するまでブロックされ、受信したデータを送信します
データがチャネルに送信されると、受信者が受信していない場合、送信動作が目詰まりし続けます。次のようにプログラムがインテリジェントに、正常に送信されたことがないランタイム文の数を見つけ、プロンプトを行うことができます行きます。
- パッケージメイン
- FUNCのmain(){
- //整数チャンネルを作成
- CH:=メイク(ちゃんint型)
- 0 //チャネルを介して送信しようとする試み
- CH < - 0
- }
コードのエラーを実行します。
致命的なエラー:すべてのゴルーチンが眠っている - デッドロック!
エラー手段:(メインを含む)すべてのゴルーチンを実行している見つけるには、待機ゴルーチンです。すなわち、対応するコードの送受信に形成されていないすべてのゴルーチンチャネルです。
チャネルを用いて受信データ
同じ使用レシーバチャネル<-
オペレータは、受信チャネルは、以下の特徴を有する:
トランシーバ・チャネル①操作は、2つの異なるゴルーチン間で行わ。
チャネルはゴルーチンの別に受信されなければならないので、受信側処理の非存在下でのデータチャネルので、データ送信側は、閉塞し続けます。
②送信機を受信すると、データを送信するまでブロックし続けます。
受信者は送信者によって送信されていないチャンネルデータを受信すると、送信者がデータを送信するまで、レシピエントブロックにも発生します。
③受光素子Aたびに。
チャンネルは1つのデータ要素を受け取ることができます。
データチャネルを受信4文言があります。
1)データを受信ブロッキング
データを受信するためにブロッキングモード、変数を受け取る<-
オペレータは、次の形式の値を左:
データ:= <-ch
これは、データを受信し、変数データに割り当てられるまでのステートメントが実行されたときにブロックされます。
2)非ブロッキングデータを受信します
チャネルからのデータを受信したときに、文が目詰まりが発生しない非ブロッキングの使用、次の形式:
データ、[OK]:= <-ch
- データ:受信データことを示しています。データが受信されない場合、ゼロ値のチャネルタイプのデータ。
- [OK]:それは、受信したデータかどうかを示します。
チャンネル非ブロッキングを受信する方法は、高いCPU占有、非常に小さいの使用を引き起こす可能性があります。あなたは、受信タイムアウト検出をしたい場合は、チャネルを選択し実行することが可能とタイマーはコンテンツの後ろに見つけることができます。
3)すべてのデータを受信し、受信したデータは無視され
データを受信しブロッキングした後、次の形式で、チャネルから返されたデータを無視します。
<-ch
文が実行されたとき、それはデータを受信するまでのブロッキングが発生しますが、受信したデータは無視されます。このアプローチは、チャネルを遮断することによって、本当にトランシーバ間だけゴルーチン同時実行の同期です。
使用同時書き込み同期チャネルを行い、次の例を参照してください。
- パッケージメイン
- インポート(
- "FMT"
- )
- FUNCのmain(){
- //チャネルを構築
- CH:=メイク(ちゃんint型)
- //同時匿名関数を開きます
- {)(FUNC行きます
- fmt.Println( "スタートゴルーチン")
- //通知ゴルーチンメインチャネルを介して
- CH < - 0
- fmt.Println( "終了ゴルーチン")
- }()
- fmt.Println( "待機ゴルーチン")
- //匿名ゴルーチンを待って
- <-ch
- fmt.Println( "すべて完了")
- }
、次の出力がコードを実行します:
ゴルーチン待つ
スタートゴルーチンの
終了ゴルーチン
すべて完了を
コードは次の通り:
- 同期のためのチャネルを構築するために、10行目。
- 13行目、同時オープン無名関数。
- 終わりに近づいて匿名ゴルーチンは、ゴルーチンを知らせるために、メインチャンネルで、この1つは受信メインゴルーチンまでブロックされていたライン18、。
- ライン27は、開口部のゴルーチン後、匿名のゴルーチンですぐにチャンネルの終了を待っています。
4)ループを受信します
受信データチャネルは、次の形式の操作を受け付ける要素の範囲文複数の借用することができます。
- =レンジCH {:データの
- }
Chがチャンネルが結果が受信されたデータであるトラバース、トラバースすることが可能です。データ型は、チャネルのデータ型です。すなわち、上記の例のデータでは、一つだけのために得られた変数を横断します。
データチャネルを横断の例としては、以下のコードを参照します。
チャネルからのデータを受信するために使用されます:
- パッケージメイン
- インポート(
- "FMT"
- "時間"
- )
- FUNCのmain(){
- //チャネルを構築
- CH:=メイク(ちゃんint型)
- //同時匿名関数を開きます
- {)(FUNC行きます
- 3-0から//ループ
- iについて:= 3; I> = 0; 私 - {
- 3-0間の伝送//値
- CH < - I
- //たびに待ち時間を送ります
- time.Sleep(time.Second)
- }
- }()
- //反復受信チャンネルデータ
- =レンジCH {:データの
- //印刷データチャネル
- fmt.Println(データ)
- それがデータ0になると//、ループを受信終了
- データは== 0の場合{
- ブレーク
- }
- }
- }
、次の出力がコードを実行します:
3
2
1
0
コードは次の通り:
- 12行目では、整数メイクによってチャネル要素を生成します。
- 15行目、同時に無名関数。
- ライン18、3-0発生周期の間の数。
- ライン21は、3-0の間の値を順次チャネルchを送信します。
- ライン24は、各送信後に1秒のポーズ。
- チャネルからのデータを受信するために使用されるライン30、。
- ライン33は、受信したデータがプリントアウトされます。
- 値0を受信したときライン36、受信が停止されます。あなたが送信し続ける場合は受信ゴルーチンが終了しましたので、ゴルーチンチャネルに送信されないので、実行時エラーのダウンをトリガします。