channel:

虽然 他们可以用来同步内存访问; 但他们最好用于在 goroutine 之间传递信息。
命名: 像河流一样,一个channel充当着信息传送的管道,值可以沿着channel传递,然后在下游读出。由于这个特点,通常使用"stream" 来做chan 变量名的后缀。
创建channel 语句:
var dataStream chan interface{}
dataStream = make(chan interface{})要声明 单向channel
声明  实例化一个只能读取的channel 如下:
var dataStream <-chan interface{}
dataStream := make(<-chan interface{})声明 实例化 一个只能写入 的channel  如下:
var dataStream chan<-  interface{}
dataStream := make(chan<- interface{})
注意: 通常不会看到单向 channel 实例化, 但是会经常看到它们用作函数参数和 返回类型,这是非常有用的,因为当需要时,Go语言会隐式地将双向
channel 转换为 单向 channel。 这里有一个例子:
var receiveChan <- chan interface{}
var sendChan  chan<- interface{}//通常做法
receiveChan = dataStream
sendChan = dataStream
func main() {stringStream := make(chan string)go func() {if 0 != 1{return}stringStream <- "Hello channels!"}()fmt.Println(<- stringStream)
}//fatal error: all goroutines are asleep - deadlock!
从channel 中读取数据可以有两个返回值;
salutation, ok := <-stringStream
可以使用 range 来遍历 channel;
可以从已关闭的channel 读取数据:
可以从已关闭的channel 读取数据:
func main() {intStream := make(chan int)close(intStream)integer, ok := <- intStreamfmt.Printf("(%v): %v", ok, integer)   //(false): 0
}为什么 已经close channel 了,还可以继续在这个channel上执行读取操作?
这是为了支持有单个上游写入,多个下游读取。
为什么 已经close channel 了,还可以继续在这个channel上执行读取操作?
这是为了支持有单个上游写入,多个下游读取。
关闭 channel 是一种同时给多个 goroutine 发信号的方法。(sync.cond也能 给多个goroutine 发信号)
由于一个被关闭的channel 可以被无数次读取;
func main() {begin := make(chan interface{})var wg sync.WaitGroupfor i:=0 ; i<5; i++{wg.Add(1)go func(i int) {defer wg.Done()<- beginfmt.Printf("%v has begun\n", i)}(i)}fmt.Println("Unblocking goroutines...")close(begin)wg.Wait()
}//Unblocking goroutines...
//1 has begun
//3 has begun
//2 has begun
//4 has begun
//0 has begun
buffered channelvar dataStream chan interface{}
dataStream = make(chan interface{}, 4)创建一个有4个容量的缓冲channel。 这意味着我们可以把4个东西放到channel上,不管它是否被读取;
声明 和实例化  还是分成两行比较好; 通过这种方式缓冲channel 是内存中的FIFO队列,用于并发进程进行通信。
未初始化的channel 默认值 是nil channel
从nil channel中读取数据 会怎样? 死锁/阻塞 <- dataStream   //fatal error: all goroutines are asleep - deadlock!
往 nil  channel中写入数据 会怎样?死锁/阻塞 dataStream <- struct {}{}   //fatal error: all goroutines are asleep - deadlock!
关闭 nil channel 会怎样?  发送 panic  错误
结论:  确保你所使用的channel都会被初始化
表格: 对不同状态的 channel 操作 的结果; todo 表格3-2
如何 组织不同类型的channel来构建健壮和稳定的东西?
正确的配置channel  / 分配channel 所有权
把 所有权定义为 实例化, 写入 和关闭 channel 的那个 goroutine。
channel 所有者 对 channel 有一个写访问  chan<-
channel 使用者,对channel 有一个只读   <-chan拥有channel 的 goroutine 应该具备如下:
1。 实例化 channel
2。 执行写操作,或将所有权传递给另一个goroutine
3。 关闭channel
4。 通过一个只读的channel 将它们暴露出来作为channel的消费者,我只需要担心两件事:
1。 知道 channel 是何时关闭的
2。 正确的处理阻塞
func main(){chanOwner := func() <-chan int {resultStream := make(chan int, 5)   //5go func() {defer close(resultStream)   //不加这句话 会报错 因为 range resultStream  不知道何时结束for i:=0; i<=5; i++{resultStream <- i}}()return resultStream}resultStream := chanOwner()for result := range resultStream {fmt.Printf("Received: %d\n", result)}fmt.Println("Done receiving!")
}
//将channel  封装在 chan 所有者函数中: 不会出现 往 nil 或 已关闭的 channel 上发生, 而且关闭总是只发生一次, 这从我们的程序中
//消除了大量的风险。原则是 尽量保持channel所有权的范围很小。
/**
这种方式是不好的,如: 一个channel 作为结构体的成员变量,并且有许多方法,它将很快变得不清楚该channel的行为方式

Go并发原语/并发组件/go并发核心语法 之channel相关推荐

  1. 深入 Go 并发原语 — Channel 底层实现

    作为 Go 并发原语的第一篇文章,一定绕不开 Go 的并发哲学.从 Tony Hoare 写的 Communicating Sequential Processes 这篇文章说起,这篇经典论文算是 G ...

  2. 蚂蚁金服面对亿级并发场景的组件体系设计

    来自:蚂蚁金服公众号mPaas 作者:吕丹(凝睇),2011 年加入支付宝,先后负责了支付宝 Wap.alipass 卡券.SYNC 数据同步等项目,并参与了多次双十一.双十二.春节红包大促活动,在客 ...

  3. Golang 基础:底层并发原语 Mutex RWMutex Cond WaitGroup Once等使用和基本实现

    文章目录 互斥锁 Mutex 拷贝使用 Mutex 的问题 读写锁 RWMutex 条件变量 Cond 等待组 WaitGroup 仅执行一次 Once 原子操作 其他 上一篇 <原生并发 go ...

  4. pv原语模拟实现_并发编程信号量的使用方法和其实现原理

    什么是信号量 信号量是并发编程中常见的一种同步机制,在需要控制访问资源的线程数量时就会用到信号量,关于什么是信号量这个问题,我引用一下维基百科对信号量的解释,大家就明白了. 信号量的概念是计算机科学家 ...

  5. go每日新闻(2022-03-07)——Go 原生并发原语和最佳实践

    每日一谚:If you don't understand the data, you don't understand the problem. go中文网每日资讯--2022-03-07 一.Go语 ...

  6. 并发面试必备系列之并发基础与内存模型

    坐标上海松江高科技园,诚聘高级前端工程师/高级 Java 工程师,有兴趣的看 JD:https://www.lagou.com/jobs/6361564.html 并发面试必备系列之并发基础与内存模型 ...

  7. java 并发框架源码_Java并发编程高阶技术-高性能并发框架源码解析与实战

    Java并发编程高阶技术-高性能并发框架源码解析与实战 1 _0 Z' @+ l: s3 f6 r% t|____资料3 Z9 P- I2 x8 T6 ^ |____coding-275-master ...

  8. 并发编程-初级之认识并发编程

    并发编程-初级之认识并发编程 1.并发领域可以处理的问题 分工: 同步:分好工之后,就可以具体执行.任务之间是有依赖的,一个任务结束之后将去去通知后续的任务.java里面 Executor.Fork/ ...

  9. 什么是并发、并行、高并发?到底多大才算高并发?

    并发是指在一个时间段内有多个进程在执行.  并行指的是在同一时刻有多个进程在同时执行. 如果是在只有一个CPU的情况下,是无法实现并行的,因为同一时刻只能有一个进程被调度执行,如果此时同时要执行其他进 ...

最新文章

  1. CVPR2021|深度感知镜面分割方法(RGBD数据)
  2. Java Volatile keyword
  3. Typora开始收费,介绍几款免费的MarkDown编辑器
  4. Yarn申请的内存的精确计算(转载+应用到自己的情况中)
  5. 决策树算法绘图——graphviz安装
  6. knn算法python代码_K-最近邻分类算法(KNN)及python实现
  7. 客户商品生命周期应用
  8. python下标是什么类型_python基本的数据类型
  9. 组态软件哪个好_组态软件推荐
  10. Appium 环境搭建
  11. PySide2将控制台内容打印到textEdit控件
  12. 如何使用CSS绘制奥运五环标志
  13. 华为鸿蒙手机版要2021开源,鸿蒙系统再起疑云:开源版和手机版完全不同,后者还有安卓彩蛋...
  14. 佐治亚理工计算机科学,佐治亚理工学院计算机科学专业如何?
  15. NIO与Netty编程(三)之Netty编程
  16. 不定高垂直居中的三种方法
  17. PSpice中VPulse的设置问题
  18. 3D立方体旋转相册特效
  19. QQ2006 界面编程之鸡蛋里挑骨头
  20. Win11下AVL Cruise-2018及后续版本 鼠标指针卡顿问题解决

热门文章

  1. vue 百度地图点聚合MarkerClusterer,缩放拖拽后label消失
  2. sql 行政区划关联查询优化_最新IP数据库 存储优化 查询性能优化 每秒解析上千万...
  3. 【考研初试】复习规划以及推荐资料/老师
  4. 【收藏】实验室十大常见危险操作,关乎生命!
  5. 为什么要学Java,这8大优势告诉你!
  6. 使用css和js实现鼠标拖尾特效
  7. 【2018 CodeM】资格赛---下单
  8. Success diary
  9. 电子沙盘数字沙盘MR AR VR开发教程
  10. 详解docker镜像管理命令