channel通道
<p>通道:channel是一种特殊的类型,通道像一个传送带或者队列,总是遵循先入先出的规则,保证收发数据的顺序。每一个通道都是一个具体类型的导管,也就是声明channel的时候需要为其指定元素类型
如何定义通道类型:
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=2677da7a51258cf0baa2bdaef5151027&amp;file=file.png" alt="" />
这样定义出来的是空值(nil),不能使用</p>
<p>可以使用make初始化之后才能使用
例如:
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=0f668ed219e82338ccfdf636bf3bc2cd&amp;file=file.png" alt="" /></p>
<p>通道channel操作:
发送 send
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=ba3f71541dc9ccafc34c0c236da8fc69&amp;file=file.png" alt="" />
接收 receive
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=85e3c427d49d0ff187542fc2c59ef7cc&amp;file=file.png" alt="" />
关闭 close
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=138642e9a778d29fe01667eed0ad84a4&amp;file=file.png" alt="" />
发送 接收都使用<-符号</p>
<p>chan <-t 只写通道
<-chan t 只读通道</p>
<p>死锁是指两个或两个以上的协程的执行过程中,由于竞争资源而阻塞的现象</p>
<p>死锁如何如何形成的:
1.一个通道在一个主goroutine协程里同时进行读和写。也会造成死锁
2.协程开启之前就放数据,还没有准备好,就放数据,就会造成死锁</p>
<p>select:可以同时响应多个通道进行操作
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=89b7295a6047e22b5bc769dc55f2d68e&amp;file=file.png" alt="" /></p>
<p>缓冲通道:先进先出的原则。第一个进去的第一个被读取到,可以理解为,一个从管道的一端放入,一个从管道的另一端读取。
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=e41b13a158f2cca0a5f1555051cffae9&amp;file=file.png" alt="" />
for range 就是遍历所有数据,当没有数据的时候也就循环结束。所以可以 替代 <strong>v,ok:=<-ch1</strong>
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=970f75c034bda4b61acef22bbf45888b&amp;file=file.png" alt="" /></p>