func ChannelTest() {
datas := []int{1, 2, 3, 4, 5}
cz := make(chan int, len(datas))
for _, data := range datas {
cz <- data
}
for i := 0; i < len(datas); i++ {
item := <-cz
fmt.Println(item)
}
for _, data := range datas {
cz <- data
}
// range函数遍历每个从通道接收到的数据,通道关闭,数据读完会自动结束循环,如果通道不关闭,那么range函数就不
// 会结束,从而在接收零值的时候就阻塞了
//close(cz)
//for data := range cz {
// fmt.Println(data)
//}
close(cz)
//channel被关闭后,不能再写入,写入会导致panic。但可以一直读取,读取到的值是类型的零值
isRun := true
for isRun {
select {
case num, ok := <-cz:
if !ok {
fmt.Println("通道关闭")
//isRun = false way1: 直接跳出for循环
cz = make(chan int) //way2: 执行default分支
} else {
fmt.Println("当前读取:", num)
}
default:
//如果通道不关闭,数据读取完之后,chan就会阻塞,从而会执行default分支
fmt.Println("执行了default代码块")
isRun = false
}
}
fmt.Println("done!")
timeChan := time.Tick(time.Second)
for {
select {
case time := <-timeChan:
fmt.Println(time) //打印时间
}
}
}
func main() {
ch := make(chan string, 0)
defer func() {
close(ch)
}()
go func() {
for {
time.Sleep(time.Second * 1)
fmt.Println(time.Now().Unix())
select {
case m := <-ch:
fmt.Println(m)
break
default:
fmt.Println("waiting...")
}
}
}()
time.Sleep(time.Second * 4)
ch <- "stop"
}
版权声明:本文为AK_97_CT原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。