hello world for channels
This commit is contained in:
parent
c45dcc9178
commit
3b54caef82
41
concurrency/channels/go.go
Normal file
41
concurrency/channels/go.go
Normal file
@ -0,0 +1,41 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func sum(a []int, c chan int) {
|
||||
s := 0
|
||||
for _, v := range a {
|
||||
s += v
|
||||
}
|
||||
c <- s
|
||||
}
|
||||
|
||||
func main() {
|
||||
a := []int{7, 2, 8, -9, 4, 0}
|
||||
c := make(chan int)
|
||||
go sum(a[:len(a)/2], c)
|
||||
go sum(a[len(a)/2:], c)
|
||||
go sum(a, c)
|
||||
x, y, z := <-c, <-c, <-c
|
||||
fmt.Printf("%d %d %d\n", x, y, z)
|
||||
|
||||
// panics with deadlock if buffer doesn't match reads from chan
|
||||
// throw: all goroutines are asleep - deadlock!
|
||||
c2 := make(chan int, 2)
|
||||
c2 <- 1
|
||||
c2 <- 2
|
||||
// must not do this without increasing buffer size: c2 <- 2
|
||||
fmt.Println(<-c2)
|
||||
fmt.Println(<-c2)
|
||||
|
||||
// note that this chanel is buffered, and that we don't need to launch go
|
||||
// routines
|
||||
c_buffered := make(chan int, 10)
|
||||
sum(a[:len(a)/2], c_buffered)
|
||||
sum(a[len(a)/2:], c_buffered)
|
||||
sum(a, c_buffered)
|
||||
x, y, z = <-c_buffered, <-c_buffered, <-c_buffered
|
||||
fmt.Printf("%d %d %d\n", x, y, z)
|
||||
}
|
Loading…
Reference in New Issue
Block a user