定义
引用类型channel是CSP模式的具体实现,用于多个goroutine通讯。其内部实现了同步没确保并发安全,默认为同步模式,需要发送和接收配对。否则会被阻塞,直到另一方准备好被唤醒
package main
import (
"fmt"
)
func main() {
data := make(chan int) //数据交换队列
exit := make(chan bool) //退出通知
go func() {
for d := range data { //从队列迭代接收数据,直到close
fmt.Println(d)
}
fmt.Println("recv over.")
exit <- true //发送退出通知
}()
data <- 1 //发送数据
data <- 2
data <- 3
close(data) //关闭队列
fmt.Println("send over.")
<-exit //等待退出通知
}
异步方式通过判断缓冲区来觉得是否阻塞,如果缓冲区已满,发送被阻塞;缓冲区为空,接收被阻塞
package main
import (
"fmt"
)
func main() {
data := make(chan int, 3)
exit := make(chan bool)
data <- 1
data <- 2
data <- 3
go func() {
for d := range data {
fmt.Println(d)
}
exit <- true
}()
data <- 4
data <- 5
close(data)
<- exit
}
可以将channel隐士转换为单向队列,只收或只发
package main
import (
)
func main() {
c := make(chan int, 3)
var send chan <- int = c
var recv <- chan int = c
send <- 1
//<- send //receive from send-only type chan<- int
//recv <- 2 //send to receive-only type <-chan int
<- recv
}