Maison >développement back-end >Golang >Utilisation avancée des Goroutines et des canaux dans Golang
Utilisation avancée des Goroutines et des canaux dans Golang
Dans la programmation simultanée de Golang, les Goroutines et les canaux sont deux concepts très importants. Les Goroutines sont des threads légers qui peuvent s'exécuter simultanément, tandis que les canaux sont le mécanisme de communication entre les Goroutines. Dans cet article, nous explorerons l'utilisation avancée des Goroutines et des canaux dans Golang et l'illustrons avec des exemples de code.
1. Utilisation avancée des Goroutines
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. Utilisation avancée des canaux
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) } }
Pour résumer, les Goroutines et les canaux de Golang offrent des capacités de programmation simultanée puissantes et flexibles. Nous avons plus de contrôle sur le comportement des Goroutines et des canaux grâce à une utilisation avancée telle que les instructions select, WaitGroup, les tampons et les mots-clés range. Nous espérons que les exemples de code donnés dans cet article pourront aider les lecteurs à mieux comprendre et appliquer ces utilisations avancées.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!