通道(channels) 是连接多个协程的管道,可以从一个协程将值发送到通道,然后在另一个协程中接收,由关键字chan
定义
使用 make(chan val-type)
创建一个新的通道。 通道类型就是需要传递值的类型
发送:channel <- info
发送 一个新的值到通道中
接收:<-channel
通道的两种类型:无缓冲(默认)、有缓冲
例子1 :无缓冲通道,并发接收
package main
import (
"fmt"
)
func main() {
message := make(chan string) //无缓冲通道
go func() {
message <- "ping" //channel <- 语法 发送 一个新的值到通道中
message <- "hhh"
}()
msg := <-message // <-channel 语法从通道中 接收 一个值
fmt.Println(msg)
msg2 := <-message
fmt.Println(msg2)
}
结果
![](https://img.haomeiwen.com/i13975801/09aa8cf90996918a.png)
例子2:有缓冲通道,无需设置并发
package main
import "fmt"
func main() {
messages := make(chan string, 2) //由于此通道是有缓冲的, 因此我们可以将这些值发送到通道中,而无需并发的接收。
messages <- "buffered"
messages <- "channel"
fmt.Println(<-messages)
fmt.Println(<-messages)
}
例子3:常见报错, fatal error: all goroutines are asleep - deadlock!
package main
import "fmt"
func main() {
messages := make(chan string) //这次不设置缓冲
messages <- "buffered"
fmt.Println(<-messages)
}
会报错: fatal error: all goroutines are asleep - deadlock!
make(chan string),开辟的通道是一种无缓冲通道,所以当对这个缓冲通道写的时候,会一直阻塞等到某个协程对这个缓冲通道读,所以执行到messages <- "buffered"
时,会产生阻塞,由于没有设置并行接收器,所以会一直等待
网友评论