チャネルは、同時実行機能間でデータを安全に転送するための Go 言語の通信メカニズムであり、共有メモリへの直接アクセスを回避するデータ競合保護を提供します。チャネル タイプには、バッファなしチャネル (chan T) とバッファありチャネル (chan T、int) があります。ルールには、値の送信 (
Go 言語関数の同時プログラミングにおけるチャネルのタイプとルール
Go 言語では、チャネルは同時関数間で通信するために使用されます。データを安全に配信するための通信メカニズム。これらは、関数が共有メモリに直接アクセスする必要性を排除する抽象化レイヤーを提供し、データ競合を回避します。
チャネル タイプ
チャネル ルール
send
演算子を使用します (< ;-
) 値をチャネルに送信します。値を送信する前に、 を使用してチャネルをロックする必要があります。
receive
演算子 (->
) を使用してチャネルから値を受信します。値の送信と同様に、値を受信する前に chan を使用してチャネルをロックする必要があります。
close(chan)
を使用します。終了後は、チャネルに値を送信できなくなりますが、すでに送信された値は引き続き受信できます。 select
ステートメントを使用すると、複数のチャネルから選択的に受信または送信できます。イベント駆動型の同時プログラミング モデルを提供します。 #実際的なケース
素数を計算するプログラムを考えてみましょう:package main import ( "fmt" "math" "sync" "time" ) // 工作单元 type WorkUnit struct { n uint64 isPrime bool finished chan bool } // 素数计算函数 func isPrime(n uint64) bool { if n <= 1 { return false } for i := uint64(2); i <= uint64(math.Sqrt(float64(n))); i++ { if n%i == 0 { return false } } return true } // 工作器函数 func worker(in, out chan *WorkUnit, wg *sync.WaitGroup) { defer wg.Done() for unit := range in { unit.isPrime = isPrime(unit.n) close(unit.finished) out <- unit } } func main() { // 输入通道 in := make(chan *WorkUnit) // 输出通道 out := make(chan *WorkUnit) // 初始化工作单元 units := make([]*WorkUnit, 500000) for i := range units { units[i] = &WorkUnit{ n: uint64(i), finished: make(chan bool), } } // 启动工作器 wg := &sync.WaitGroup{} for i := 0; i < 5; i++ { wg.Add(1) go worker(in, out, wg) } // 将工作单元推送到输入通道 start := time.Now() for _, unit := range units { in <- unit } close(in) // 从输出通道接收结果 for unit := range out { <-unit.finished } elapsed := time.Since(start) fmt.Printf("Took %s\n", elapsed) }この例では:
チャネルは、作業単位をワーカー関数に送信するために使用されるバッファリングされていないチャネルです。
チャネルは、計算結果を main 関数に戻すために使用されるバッファ チャネルです。
チャネルは、ワーカー関数が計算を完了した後に main 関数に通知するために使用されるバッファリングされていないチャネルです。
以上がGolang関数の同時プログラミングにおけるチャネルの種類とルールの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。