Go 言語では、チャネル (chan) はゴルーチン間の通信パイプであり、ゴルーチンが別のゴルーチンと通信するための媒体です。チャネルは、ある goroutine が別の goroutine にデータを送信できるようにするテクノロジーです。デフォルトでは、チャネルは双方向であり、goroutine が同じチャネルを通じてデータを送受信できることを意味します。
このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。
Go 言語では、チャネル (chan) はゴルーチン間の通信用のパイプラインであり、ゴルーチンが別のゴルーチンと通信するための媒体であり、この通信はロックフリーです。言い換えれば、チャネルは、ある goroutine が別の goroutine にデータを送信できるようにするテクノロジーです。デフォルトでは、チャネルは双方向です。これは、次の図に示すように、ゴルーチンが同じチャネルを通じてデータを送受信できることを意味します。代わりに共有メモリ。ゴルーチン間でリソースを共有する必要がある場合、チャネルはゴルーチン間にパイプラインを設定し、データの同期交換を保証するメカニズムを提供します。チャネルを宣言するときは、共有するデータのタイプを指定する必要があります。組み込み型、名前付き型、構造型、および参照型の値またはポインターは、チャネルを通じて共有できます。
ここでの通信方法は、次の図に示すようにチャネルを使用します。
写真: goroutine とチャネル間の通信地下鉄の駅、食堂、トイレなどの公共の場所で多くの人がいる状況では、誰もがこの習慣を身につけています。また、混雑やキュージャンプによって発生する非効率的なリソースの使用や交換プロセスも回避できます。コードやデータも同様で、データを奪い合うために複数のゴルーチンが存在すると必然的に実行効率が悪くなります。最も効率的な方法はキューを使用することです。チャネルはキューのような構造です。Go言語におけるチャネル(channel)は特殊な型です。常に 1 つの goroutine だけがチャネルにアクセスしてデータを送信および取得できます。 goroutine はチャネルを通じて通信できます。 チャネルはコンベア ベルトまたはキューのようなもので、常に先入れ先出し (先入れ先出し) ルールに従ってデータの送受信の順序を保証します。
チャネルの作成Go 言語では、chan キーワードを使用してチャネルを作成します。チャネルは同じ種類のデータのみを送信できます。異なるタイプのデータを同じチャネルから転送することを許可しません。 構文:
var Channel_name chan Type短縮宣言を使用して、make() 関数を通じてチャネルを作成することもできます。
構文:
channel_name:= make(chan Type)例
package main import "fmt" func main() { //使用var关键字创建通道 var mychannel chan int fmt.Println("channel的值: ", mychannel) fmt.Printf("channel的类型: %T ", mychannel) // 使用 make() 函数创建通道 mychannel1 := make(chan int) fmt.Println("\nchannel1的值:", mychannel1) fmt.Printf("channel1的类型: %T ", mychannel1) }出力:
channel的值: <nil> channel的类型: chan int channel1的值: 0xc0000160c0 channel1的类型: chan intチャネルからのデータの送受信
Go 言語におけるチャネルワークには、送信と受信の 2 つの主な操作があり、これら 2 つの操作を総称して通信と呼びます。 1. 送信オペレーション
: 送信オペレーションは、チャネルを利用して、ある goroutine から別の goroutine にデータを送信するために使用されます。 int、float64、bool などの値はコピーされるため、チャネル経由で安全かつ簡単に送信できるため、同じ値に誤って同時にアクセスするリスクがありません。同様に、文字列は不変であるため安全です。ただし、チャネルを介してポインターまたは参照 (スライス、マップ コレクションなど) を送信することは安全ではありません。ゴルーチンを同時に送信または受信することによってポインターまたは参照の値が変更される可能性があり、結果が予測できないためです。したがって、チャネルでポインターまたは参照を使用する場合は、一度に 1 つの goroutine のみがそれらにアクセスできるようにする必要があります。Mychannel <- element上記のステートメントは、データ (要素) が 2. 受信オペレーション : 受信オペレーションは、送信オペレータによって送信されたデータを受信するために使用されます。
element := <-Mychannel上記のステートメントは、要素がチャネル (Mychannel) からデータを受信することを示しています。これは、受信したステートメントの結果が利用できない場合にも有効なステートメントです (使用する必要はありません)。次の受信ステートメントを記述することもできます:
<-MychannelExample
package main import "fmt" func myfunc(ch chan int) { fmt.Println(234 + <-ch) } func main() { fmt.Println("主方法开始") //创建通道l ch := make(chan int) go myfunc(ch) ch <- 23 fmt.Println("主方法结束") }出力:
主方法开始 257 主方法结束[関連する推奨事項:
Go ビデオ チュートリアル
、プログラミング教育
]以上がGo言語のchanチャンネルとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。