package main
import (
"fmt"
"time"
)
var strChan = make(chan string, 3)
func main() {
syncChan1 := make(chan struct{}, 1)
syncChan2 := make(chan struct{}, 2)
go receive(strChan, syncChan1, syncChan2) //用于演示接收操作
go send(strChan, syncChan1, syncChan2) //用于演示发送操作
<-syncChan2
<-syncChan2
}
//注意通道参数的写法的理解:syncChan1 <-chan ===> syncChan1 可理解为 在函数体中 替代 <-chan,用于从通道中接收数据。
//因此函数体中的写法为:<-syncChan1 (syncChan1 在此处代表着参数中的通道,用于发出数据,在函数体中接收)
func receive(strChan <-chan string,
syncChan1 <-chan struct{},
syncChan2 chan<- struct{}) {
<-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{}{}
}
func send(strChan chan<- string,
syncChan1 chan<- struct{},
syncChan2 chan<- struct{}) {
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 second... [sender]")
time.Sleep(time.Second * 2)
close(strChan)
syncChan2 <- struct{}{}
}
/*
输出结果:
Sent: a [sender]
Sent: b [sender]
Sent: c [sender]
sent a sync signal.[sender]
Received a sync signal and wait a second... [receiver]
Sent: d [sender]
Wait 2 second... [sender]
Received: a [receiver]
Received: b [receiver]
Received: c [receiver]
Received: d [receiver]
Stopped. [receiver]
*/
网友评论