Golang でのゴルーチンとチャネルの高度な使用法
Golang での同時プログラミングでは、ゴルーチンとチャネルは 2 つの非常に重要な概念です。ゴルーチンは同時に実行できる軽量のスレッドであり、チャネルはゴルーチン間の通信メカニズムです。この記事では、Golang でのゴルーチンとチャネルの高度な使用法を探り、コード例で説明します。
1. Goroutine の高度な使用法
package main import ( "fmt" ) func fibonacci(n int, c chan<- int) { x, y := 0, 1 for i := 0; i < n; i++ { c <- x x, y = y, x+y } close(c) } func factorial(n int, c chan<- int) { result := 1 for i := 1; i <= n; i++ { result *= i } c <- result close(c) } func main() { fibChan := make(chan int) factChan := make(chan int) go fibonacci(10, fibChan) go factorial(5, factChan) for { select { case fib, ok := <-fibChan: if ok { fmt.Println("Fibonacci:", fib) } else { fibChan = nil } case fact, ok := <-factChan: if ok { fmt.Println("Factorial:", fact) } else { factChan = nil } default: if fibChan == nil && factChan == nil { return } } } }
package main import ( "fmt" "sync" ) func fibonacci(n int, c chan<- int, wg *sync.WaitGroup) { defer wg.Done() x, y := 0, 1 for i := 0; i < n; i++ { c <- x x, y = y, x+y } close(c) } func factorial(n int, c chan<- int, wg *sync.WaitGroup) { defer wg.Done() result := 1 for i := 1; i <= n; i++ { result *= i } c <- result close(c) } func main() { fibChan := make(chan int) factChan := make(chan int) var wg sync.WaitGroup wg.Add(2) go fibonacci(10, fibChan, &wg) go factorial(5, factChan, &wg) go func() { wg.Wait() close(fibChan) close(factChan) }() for { select { case fib, ok := <-fibChan: if ok { fmt.Println("Fibonacci:", fib) } else { fibChan = nil } case fact, ok := <-factChan: if ok { fmt.Println("Factorial:", fact) } else { factChan = nil } default: if fibChan == nil && factChan == nil { return } } } }
2. チャネルの高度な使用法
package main import ( "fmt" ) func main() { ch := make(chan int, 3) ch <- 1 ch <- 2 ch <- 3 fmt.Println(<-ch) fmt.Println(<-ch) fmt.Println(<-ch) }
package main import ( "fmt" "time" ) func counter(ch chan<- int) { for i := 1; i <= 5; i++ { ch <- i time.Sleep(time.Second) } close(ch) } func main() { ch := make(chan int) go counter(ch) for val := range ch { fmt.Println(val) } }
要約すると、Golang のゴルーチンとチャネルは、強力で柔軟な同時プログラミング機能を提供します。 select ステートメント、WaitGroup、バッファー、range キーワードなどの高度な使用法を使用して、ゴルーチンとチャネルの動作をより詳細に制御できます。この記事で示したコード例が、読者がこれらの高度な使用法をより深く理解し、適用するのに役立つことを願っています。
以上がGolang でのゴルーチンとチャネルの高度な使用法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。