通道(Chanels)--协程交互(匿名函数)
2018-12-03 本文已影响0人
bocsoft
package main
import (
"fmt"
"time"
)
var strChan = make(chan string, 3)
func main() {
syncChan1 := make(chan struct{}, 1)
syncChan2 := make(chan struct{}, 2)
go func() { // 用于演示接收操作
<-syncChan1
fmt.Println("Received a sync signal and wait a second...[receiver]")
time.Sleep(time.Second)
for {
if elem, ok := <-strChan; ok {
fmt.Println("Received:", elem, "[receiver]")
} else {
break
}
}
fmt.Println("Stopped. [receiver]")
syncChan2 <- struct{}{}
}()
go func() { //用于演示发送操作
for _, elem := range []string{"a", "b", "c", "d"} {
strChan <- elem
fmt.Println("Sent:", elem, "[sender]")
if elem == "c" {
syncChan1 <- struct{}{}
fmt.Println("Sent a sync signal. [sender]")
}
}
fmt.Println("Wait 2 seconds...[sender]")
time.Sleep(time.Second * 2)
close(strChan)
syncChan2 <- struct{}{}
}()
//如果下面两个语句都注释掉的化,程序会瞬间执行结束
<-syncChan2
<-syncChan2
}
// 输出 结果:
/*
Sent: a [sender]
Sent: b [sender]
Sent: c [sender]
Sent a sync signal. [sender]
Received a sync signal and wait a second...[receiver]
Received: a [receiver]
Received: b [receiver]
Sent: d [sender]
Wait 2 seconds...[sender]
Received: c [receiver]
Received: d [receiver]
Stopped. [receiver]
Process finished with exit code 0
*/