channel
Posted lajiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了channel相关的知识,希望对你有一定的参考价值。
// 参考:https://www.cnblogs.com/wdliu/p/9272220.html
channel使用
定义和声明
var readOnlyChan <-chan int // 只读chan
var writeOnlyChan chan<- int // 只写chan
var mychan chan int //读写channel
//定义完成以后需要make来分配内存空间,不然使用会deadlock
mychannel = make(chan int,10)
//或者
read_only := make (<-chan int,10)//定义只读的channel
write_only := make (chan<- int,10)//定义只写的channel
read_write := make (chan int,10)//可同时读写
复制代码
读写数据
需要注意的是:
管道如果未关闭,在读取超时会则会引发deadlock异常
管道如果关闭进行写入数据会pannic
当管道中没有数据时候再行读取或读取到默认值,如int类型默认值是0
ch <- "wd" //写数据
a := <- ch //读取数据
a, ok := <-ch //优雅的读取数据
循环管道
需要注意的是:
使用range循环管道,如果管道未关闭会引发deadlock错误。
如果采用for死循环已经关闭的管道,当管道没有数据时候,读取的数据会是管道的默认值,并且循环不会退出。
package main
import (
"fmt"
"time"
)
func main() {
mychannel := make(chan int,10)
for i := 0;i < 10;i++{
mychannel <- i
}
close(mychannel) //关闭管道
fmt.Println("data lenght: ",len(mychannel))
for v := range mychannel { //循环管道
fmt.Println(v)
}
fmt.Printf("data lenght: %d",len(mychannel))
}
带缓冲区channe和不带缓冲区channel
带缓冲区channel:定义声明时候制定了缓冲区大小(长度),可以保存多个数据。
不带缓冲区channel:只能存一个数据,并且只有当该数据被取出时候才能存下一个数据。
ch := make(chan int) //不带缓冲区
ch := make(chan int ,10) //带缓冲区
以上是关于channel的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin 协程Channel 通道 ④ ( Channel 通道的热数据流属性 | Channel 通道关闭过程 | Channel 通道关闭代码示例 )
FFmpeg拼接文件时报错channel element 1.0 is not allocated的分析思路和解决方法
FFmpeg拼接文件时报错channel element 1.0 is not allocated的分析思路和解决方法
FFmpeg拼接文件时报错channel element 1.0 is not allocated的分析思路和解决方法