Erweiterte Verwendung von Goroutinen und Kanälen in Golang
In der gleichzeitigen Programmierung von Golang sind Goroutinen und Kanäle zwei sehr wichtige Konzepte. Goroutinen sind leichtgewichtige Threads, die gleichzeitig ausgeführt werden können, während Kanäle der Kommunikationsmechanismus zwischen Goroutinen sind. In diesem Artikel werden wir die erweiterte Verwendung von Goroutinen und Kanälen in Golang untersuchen und anhand von Codebeispielen veranschaulichen.
1. Erweiterte Verwendung von Goroutinen
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. Erweiterte Nutzung von Kanälen
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) } }
Zusammenfassend lässt sich sagen, dass Goroutinen und Kanäle in Golang leistungsstarke und flexible Funktionen für die gleichzeitige Programmierung bieten. Wir haben mehr Kontrolle über das Verhalten von Goroutinen und Kanälen durch erweiterte Verwendung wie Select-Anweisungen, WaitGroup, Puffer und Bereichsschlüsselwörter. Wir hoffen, dass die Codebeispiele in diesem Artikel den Lesern helfen können, diese erweiterten Verwendungen besser zu verstehen und anzuwenden.
Das obige ist der detaillierte Inhalt vonErweiterte Verwendung von Goroutinen und Kanälen in Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!