马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
在 Go 中,通道(channel)会在以下环境下壅闭:
1. 发送操纵壅闭
- 无缓冲通道: 当你向无缓冲通道发送数据时,假如没有其他 goroutine 读取数据,发送操纵将壅闭。
- ch := make(chan int) // 无缓冲通道
- ch <- 1 // 阻塞,直到有接收者
复制代码 - 缓冲通道已满: 当缓冲通道的缓冲区已满时,尝试发送数据将壅闭,直到有空间可用。
- ch := make(chan int, 2) // 缓冲通道,大小为 2
- ch <- 1
- ch <- 2
- // ch <- 3 // 阻塞,直到有人接收
复制代码 2. 接收操纵壅闭
- 无缓冲通道: 当你从无缓冲通道接收数据时,假如没有其他 goroutine 发送数据,接收操纵将壅闭。
- ch := make(chan int) // 无缓冲通道
- val := <-ch // 阻塞,直到有人发送
复制代码 - 缓冲通道为空: 当尝试从缓冲通道接收数据时,假如通道为空,接收操纵将壅闭,直到有数据可用。
- ch := make(chan int, 2) // 缓冲通道
- // ch <- 1
- // val := <-ch // 阻塞,直到有人发送数据
复制代码 3. select 语句壅闭
- select 会壅闭,直到此中一个 case 可执行。假如全部的 case 都不可执行(比方,全部的通道都没有数据可读或没有空间可写),则 select 将壅闭。
- select {
- case msg := <-ch1: // 如果 ch1 没有数据则阻塞
- fmt.Println(msg)
- case ch2 <- 2: // 如果 ch2 满则阻塞
- fmt.Println("Sent to ch2")
- }
复制代码 4. 制止壅闭
- 使用 default: 在 select 中添加 default 分支可以制止壅闭。
- select {
- case msg := <-ch:
- fmt.Println(msg)
- default:
- fmt.Println("No messages received")
- }
复制代码 总结
通道的壅闭机制是 Go 实现并发的紧张特性,它确保了数据的安全传递和同步。在使用通道时,理解何时会壅闭对于编写高效的并发程序至关紧张。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |