Golang 向已关闭的chan读写数据会怎样
1. 向已关闭的chan写
会直接panic,报 send to close channel错误
package main
func main() {
// 创建缓冲区为4的字符串chan
schoolChan := make(chan string, 4)
// 放入3个值
schoolChan <- "国防科大"
schoolChan <- "北京大学"
schoolChan <- "湖南大学"
// 关闭chan
close(schoolChan)
// 尝试写数据,会panic: send to close channel
schoolChan <- "中南大学"
}
2. 向已关闭的chan读
会返回2个值,若已关闭的chan中还存在值,第二个值为true,第一个值为对应的chan中的值,若已关闭的chan中不存在值,第二个值为false,第一个值为对应chan类型的零值
package main
import "fmt"
func main() {
// 创建缓冲区为4的字符串chan
schoolChan := make(chan string, 4)
// 放入3个值
schoolChan <- "国防科大"
schoolChan <- "北京大学"
schoolChan <- "湖南大学"
// 关闭chan
close(schoolChan)
// 向已关闭的chan读
if school, isEmpty := <-schoolChan; isEmpty {
fmt.Println("school:", school)
}
// 向已关闭的chan读
if school, isEmpty := <-schoolChan; isEmpty {
fmt.Println("school:", school)
}
// 向已关闭的chan读
if school, isEmpty := <-schoolChan; isEmpty {
fmt.Println("school:", school)
}
// 向若chan不存在元素,则第二个参数的值为 false
if school, isEmpty := <-schoolChan; isEmpty {
fmt.Println("school:", school)
}
}
- 使用for循环遍历chan,若chan未关闭则会堵塞等待chan放入元素,如chan关闭则取出chan内所有元素并终止循序
package main
import (
"fmt"
)
func main() {
// 创建缓冲区为4的字符串chan
schoolChan := make(chan string, 4)
// 放入3个值
schoolChan <- "国防科大"
schoolChan <- "北京大学"
schoolChan <- "湖南大学"
// 关闭chan
close(schoolChan)
// for循环遍历channel,会将已关闭的chan中缓冲区的数据取出完后终止循序
for school := range schoolChan {
fmt.Println("school:", school)
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通