[channel] channel's usage
//使用通道同步goroutine
func printNumbers(w chan bool) {
for i := 0; i < 10; i++ {
time.Sleep(1 * time.Microsecond)
fmt.Printf("%d ", i)
}
w <- true
}
func printLetters(w chan bool) {
for i := 'A'; i < 'A'+10; i++ {
time.Sleep(1 * time.Microsecond)
fmt.Printf("%c ", i)
}
w <- true
}
func main() {
w1, w2 := make(chan bool), make(chan bool)
go printNumbers(w1)
go printLetters(w2)
<-w1
<-w2
}
//使用通道实现消息传递
func thrower(c chan int) {
for i := 0; i < 5; i++ {
c <- i
fmt.Println("Threw >>", i)
}
}
func catcher(c chan int) {
for i := 0; i < 5; i++ {
num := <-c
fmt.Println("Caught <<", num)
}
}
func main() {
c := make(chan int, 3)
go thrower(c)
go catcher(c)
time.Sleep(100 * time.Millisecond)
}
//用关闭通道的方式避免死锁
func callerA(c chan string) {
c <- "Hello World!"
close(c)
}
func callerB(c chan string) {
c <- "Hola Mundo!"
close(c)
}
func main() {
a, b := make(chan string), make(chan string)
go callerA(a)
go callerB(b)
var msg string
openA, openB := true, true
for openA || openB {
select {
case msg, openA = <-a:
if openA {
fmt.Printf("%s from A\n", msg)
}
case msg, openB = <-b:
if openB {
fmt.Printf("%s from B\n", msg)
}
}
}
}