ゴルーチンは、チャネルの概念(チャネル)を導入し、データの正確性を確保するためにそのようなミューテックスなどの問題を回避するために、メモリリソースを共有するので
言語チャネル(チャネル)を移動します特殊なタイプです。いつでも、彼らの唯一のゴルーチンアクセスチャネルが送信し、データを取得します。ゴルーチン間のチャネルを介して通信することができます。
コンベアベルトまたはチャネルキューのようには、常にFIFO(先入れ先出し)の規則に従うデータトランシーバの順序を保証します。
声明:
VAR型チャネルちゃん変数名
VAR AちゃんのINT // チャネルはintです
ヌルちゃんの種類は、文の後に満たすために必要を利用するためには、nilです。
初出:
チャンネルでは、次の形式で、作成するのに活用する必要がある、参照型です:
例チャンネル名:=メイク(ちゃんタイプ)
VAR C2ちゃんINT C1: =(チャン作るインターフェイス{}) C2 =(チャン作るINTを)
データを送信します:
可変チャンネル< - バリュー
C1:メイク(チャン= インターフェイス{}) CH < - 0 // 通路に0を、必要としているそれ以外の場合はエラーを
データがチャネルに送信されると、受信者が受信していない場合、送信動作が目詰まりし続けます。プログラムがいくつか正常に送信されたことがない文は、プログラムが実行されて行くと、プロンプト作る見つけることができます確認してください。
メインFUNC(){ CHは:メイクを=(チャンのインタフェース{}) // 0は、チャネル内に配置されている - CH < 0 // チャネルにおけるハローストリング - CH < " ハロー" fmt.Print(CH) }
結果:
致命的なエラー:すべてのゴルーチンが眠っている - デッドロック!
ゴルーチン1 [チャン送ります]:
main.main()
D:/SoloWork/Learn/main.go:8 + 0x76
データの受信:
データは、チャネル側の処理で受信されていないので、送受信動作は、二つの異なるゴルーチン間のチャネルで実行される、データ送信側は閉塞し続けます
まで送信側までデータを送信した、受信者がチャネルデータが送信者によって送信されない受信した場合、受信機ブロッキングが発生し、送信側まで送信データブロックを受信し続けます
チャンネルは1つのデータ要素を受け取ることができます。
受信データをブロックします
受信値:= < - チャンネル名
データ:= <-ch
データを受信ノンブロッキング
値を受信し、チャネルが閉じられたかどうかを判断する:= < - チャンネル名
データ、[OK]:= <-ch
チャネルは偽OKに閉じているとき
任意のデータを受信し、無視されたデータは、受信します
<-ch
文が実行されたときに、それがデータを受信するまで、ブロッキングが発生しますが、受信したデータは無視されます。
このアプローチは、主にトランシーバを遮断チャンネル同時実行ゴルーチン間の同期のために使用されます。
受信ループ
受信動作によって受信されたデータチャネルは、要素の範囲文複数の借用することができ
用データ:=レンジCH {}
Chがチャンネルが結果が受信されたデータであるトラバース、トラバースすることが可能です。データ型は、チャネルのデータ型です。トラバースのための変数は一つだけ、すなわちデータを取得します
閉じるの通路:
クローズ(チャンネル名)
主レンジサイクルを終了するために使用されます。
唯一の送信者は、チャネルを閉じることができ、受信機はできません
送信者は()チャネルが閉じているかどうかをテストするために受信された第2のパラメータの表現によって割り当てられた受信者に送信する必要に近い値で表されるチャネルを閉じることができます
ウェイチャンネル:
VaRのチャネルインスタンスちゃん< -要素タイプ// のみ伝送チャネル VARのチャネル例<ちゃん要素タイプ// のみチャネルを受信します
一方向チャネルがデータで満たされたチャネルではない(送信)のみを読み取ることができ、ほとんどの時間は、主インタフェースコードを確保するために厳格ため、無意味です
バッファチャンネル:
設けられた第二のパラメータとして、バッファの長 make
チャネルバッファがで初期化されます。
例チャネル名:=メーク(チャンタイプ、バッファの長さ)
CH:=が作る(ちゃんint型、100)
チャネルがバッファを有する場合に、チャネル・バッファが一杯になった場合にのみ、データは閉塞それ送信されます。バッファが空の場合、受信者はブロックされます。
緩衝チャネルは、受信者を完了するための送信処理を受けて、メモリ空間が一杯になった場合にのみ、ブロッキングが発生しなくなるジャムが発生するのを待たずに送信されます。同様に、チャネル・データ・バッファ場合、受信したデータがチャネルまで読み出されていない場合、ブロッキングが発生せず、チャネルが再び遮断されます。(オペレーティング・システム内部のミューテックスの初期量に相当)
緩衝チャネルとして見ることができるバッファなしのチャネル長は常に0である(すなわち、データの送信にブロック化が開始され、ミューテックスに相当)