Go 言語は、並行プログラミング指向の言語として、ゴルーチン、チャネル、select ステートメントなどの機能を同期メカニズムの設計に導入し、並行プログラミングをより簡単かつ効率的にします。この記事では、Go 言語の同期メカニズムの原理と実装を深く掘り下げ、具体的なコード例を示して説明します。
Go 言語における goroutine は、Go ランタイムによって管理される軽量スレッドの概念です。 goroutine を使用すると、同時プログラミングを簡単に実装できます。以下は簡単なゴルーチンの例です。
package main import ( "fmt" "time" ) func hello() { fmt.Println("Hello, goroutine!") } func main() { go hello() time.Sleep(1 * time.Second) fmt.Println("Main function") }
上記のコードでは、go hello()
によって hello()
関数を実行するゴルーチンが作成されます。 ##main 関数内の
#fmt.Println("Main function") はゴルーチンの実行後に実行されます。
package main import ( "fmt" ) func sum(s []int, c chan int) { sum := 0 for _, v := range s { sum += v } c <- sum } func main() { s := []int{1, 2, 3, 4, 5} c := make(chan int) go sum(s[:len(s)/2], c) go sum(s[len(s)/2:], c) x, y := <-c, <-c fmt.Println(x, y, x+y) }上記のコードでは、
make(chan int)、
sum() 関数を使用して整数チャネルを作成します。 合計を送信します。スライス
s の前半と後半の部分をチャネルに渡し、
main 関数は
x, y := 3. select ステートメント
package main import ( "fmt" "time" ) func main() { c1 := make(chan string) c2 := make(chan string) go func() { time.Sleep(1 * time.Second) c1 <- "One" }() go func() { time.Sleep(2 * time.Second) c2 <- "Two" }() for i := 0; i < 2; i++ { select { case msg1 := <-c1: fmt.Println("Received", msg1) case msg2 := <-c2: fmt.Println("Received", msg2) } } }
上記のコードでは、select ステートメントは 2 つのチャネル
c1 と c2
のデータ ストリームを接続するために使用されています。選択して、適切なメッセージを印刷します。 概要
以上がGo 言語の同期メカニズムの原理と実装についての詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。