课程名称:GO开发工程师
课程章节:6-1:channel
课程讲师: ccmouse
课程内容:
- 约束channel只写只读:
// chan<- int: 只能往chan里写数据
// <-chan int: 只能从chan里读数据
func createWorkerSpecChan(i int) chan<- int {
c := make(chan int)
go func() {
for {
fmt.Printf("i: %d---> n: %c\n", i, <-c)
}
}()
return c
}
- channel缓冲区
func buffered() {
c := make(chan int, 3) // 建立缓冲区,可以不必没发一次数据就必须开一个协程去消费
go worker(0, c)
c <- '1'
c <- '2'
c <- '3' // 可以发3个数据
time.Sleep(time.Minute) // 延迟主程序main退出
}
- 关闭channel
func channelClose() {
c := make(chan int)
go worker(0, c)
c <- '1'
c <- '2'
c <- '3'
close(c) // 关闭channel,告诉接收方已经发送完毕
time.Sleep(time.Minute) // 延迟主程序main退出
}
- 监测channel退出的方式
func worker(i int, c chan int) {
//方式一: 手动判断,跳出
for {
n, ok := <-c
if !ok { // 如果接收失败(channel关闭),跳出循环
break
}
// printf 是io操作,输出的顺序不确定(会被调度器调度)
fmt.Printf("i: %d---> n: %c\n", i, n)
}
// 方式二: for range
for n := range c { //
fmt.Printf("i: %d---> n: %c\n", i, n) // channel关闭后自动跳出
}
// 如果channel关闭,c打印出来的值永远是 chan int的零值
}
课程收获:
- go语言channel的设计初衷:通过通信来共享内存。
传统的语言是通过共享内存来通信。 - 何为共享内存:
比如: 通过共享一个标志变量flag,当flag为true时其它人就知道当前任务已完成。 - 如果channel关闭,接收者仍然从channel里去读数据,那么获取到的值永远是channel 类型(int时为0)的零值
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦