私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
ゴルーチンは同じアドレス空間で実行されるため、共有メモリへのアクセスは同期する必要があります。ゴルーチンはメモリを共有するのではなく、通信を通じてメモリを共有します。
参照型チャネルは CSP モードの特定の実装であり、複数の goroutine 通信に使用されます。内部的に同期を実装して同時実行の安全性を確保します。
マップと同様に、チャネルも make によって作成された基礎となるデータ構造への参照です。
チャネルをコピーするか、関数パラメータの受け渡しにチャネルを使用する場合、チャネル参照をコピーするだけなので、呼び出し元と呼び出し先は同じチャネル オブジェクトを参照します。他の参照型と同様に、チャネルのゼロ値は nil です。
チャネルを定義するときは、チャネルに送信される値のタイプも定義する必要があります。 チャネルは、組み込みの make() 関数を使用して作成できます。
make (chan Type)
make (chan Type,capacity)
channel<-value //发送value 到channel
<-channel //接收并将其丢弃
x:=<-channel //从 channel 中接收数据,并賦偵给x
x,ok:=<-channel //功能同上,同时检查通道是否已关闭或者是否为空
デフォルトでは、相手側の準備ができていない限り、データの送受信時にチャネルがブロックされるため、明示的なロックを必要とせずに goroutine の同期が簡単になります。
バッファなしチャネルは、受信前に値を保存する機能がないチャネルです。
このタイプのチャネルでは、送信ゴルーチンと受信ゴルーチンが同時に送信操作と受信操作を完了する準備ができている必要があります。 2 つのゴルーチンが同時に準備ができていない場合、チャネルにより、最初に送信または受信操作を実行するゴルーチンがブロックされて待機します。
チャネルへの送信と受信のこの対話は本質的に同期的です。 1 つの操作が他の操作から独立して存在することはできません。
次の図は、バッファなしチャネルを使用して 2 つのゴルーチンがどのように値を共有できるかを示しています。
make (chan Type)//等价于make (chan Type,0)
バッファ サイズが指定されていない場合、チャネルは同期であるため、送信側の送信準備が整い、受信側の受信準備が整うまでブロックされます。
バッファリングされたチャネルは、受信前に 1 つ以上の値を保存できるチャネルです。
このタイプのチャネルでは、ゴルーチンが送信と受信を同時に完了する必要はありません。チャネルには、送受信アクションをブロックするさまざまな条件もあります。受信アクションは、受信するチャネルに値がない場合にのみブロックされます。送信アクションは、送信される値を収容できる使用可能なバッファーがチャネルにない場合にのみブロックされます。
これは、バッファー付きチャネルとバッファーなしチャネルの間に大きな違いをもたらします。バッファーなしチャネルでは、ゴルーチンの送信と受信が同時にデータを交換することが保証されますが、バッファー付きチャネルにはそのような保証はありません。
make (chan Type,capacity)
バッファ容量が指定されている場合、チャネルは非同期になります。バッファにデータ送信用の未使用スペースがあるか、受信可能なデータが含まれている限り、通信はブロックされずに続行されます。
チャネルは ok を使用して、チャネルがまだ開いているかどうかを検出できます。チャネルが閉じている場合、データは読み取られません。
num ,ok:=<-ch
チャネルが閉じているかどうかを検出できます。デフォルトでは、チャネルはデュアル質問です。つまり、チャネルにデータを送信したり、チャネルからデータを受信したりできます。
ただし、チャネルがパラメータとして渡されることがよくあり、その値はデータの送信のみまたはデータの受信のみに一方向で使用されることが期待されます。このとき、チャネルの方向を指定できます。一方向チャメル変数の宣言は、次のように非常に簡単です。
var ch1 chan int //ch1双向
var ch2 chan<-float64 //ch2单向,只能用于写float64数据
var ch3 <-chan int //ch3单向,只能用于读int数据
chan<- は、データがパイプに入り、データがパイプに書き込まれ、呼び出し元に出力されることを意味します。
<-chan は、データがパイプから取得されることを示します。呼び出し側にとっては、パイプからのデータが取得されます。これはもちろん入力です。
チャネルは暗黙的に受信のみまたは送信のみの一方向キューに変換できますが、一方向チャネルを通常のチャネルに変換することはできません。