当前位置: 首页 > news >正文

golang学习-channel管道

1、定义

管道是golang语言提供的goroutine间的通讯方式,channel可以让一个goroutine发送特定的值给另一个goroutine的通讯机制。

管道是引用类型。

golang语言中channel是一种特殊的类型。像一个队列一样,先进先出。

var 变量 chan 元素类型

var ch1 chan int //声明一个传递整型的管道

var ch2 chan []int 

 2、创建管道

ch := make(chan 类型 容量)

//给管道里面存储数据

ch <- 10

// 获取管道里面的内容

a:=<-ch

<=-ch  //从管道取值,不赋给变量

3、管道阻塞

1、管道存储的数据超过容量。

2、在没有使用协程的情况下,如果管道的数据全部取出,再取就会报deadlock

4、循环遍历管道数据

使用for range遍历管道,需要关闭管道 close(ch1)

for 循环 可以不用关闭


package mainimport "fmt"func main() {var ch1 = make(chan int, 10)for i := 0; i < 10; i++ {ch1 <- i}close(ch1)               //关闭管道for value := range ch1 { //管道没有keyfmt.Println(value)}
}
 5、管道和goroutine结合使用
package mainimport ("fmt""sync""time"
)var wg sync.WaitGroupfunc writeData(ch chan int) {for i := 0; i < 10; i++ {ch <- ifmt.Printf("写入数据%v成功\n", i)time.Sleep(time.Millisecond * 50)}close(ch)wg.Done()
}func readData(ch chan int) {for v := range ch {fmt.Printf("读取数据%v成功\n", v)time.Sleep(time.Millisecond * 50)}wg.Done()
}func main() {var ch1 = make(chan int, 10)wg.Add(1)go writeData(ch1)wg.Add(1)go readData(ch1)wg.Wait()
}
6、单向管道

//管道声明为只写

ch2 := make(chan<- int,2)

//管道声明为只读

ch3 :=make(<-chan int,2)

7、多路复用 select

select 的使用类似于 switch 语句,它有一系列 case 分支和一个默认的分支。每个 case 会对
应一个管道的通信(接收或发送)过程。select 会一直等待,直到某个 case 的通信操作完成
时,就会执行 case 分支对应的语句。

使用select来获取channel里面的数据不需要关闭channel

select{
case <-ch1:
...
case data := <-ch2:
...
case ch3<-data:
...
default:
默认操作
}

http://www.lryc.cn/news/286522.html

相关文章:

  • oracle 12 查询数据库锁
  • 【LeetCode-135】分发糖果(贪心)
  • 5G_射频测试_发射机测量(四)
  • MySQL经典50题
  • 常用的Qt开源库分享
  • Unity开发授权系统
  • 一周时间,开发了一款封面图生成工具
  • 【.NET Core】深入理解异步编程模型(APM)
  • pyqtgraph绘图类
  • C#6-10新增的内容
  • 【立创EDA-PCB设计基础】3.网络表概念解读+板框绘制
  • 在Python环境中运行R语言的配环境实用教程
  • 2023年总结我所经历的技术大变革
  • 基于YOLOv7算法的高精度实时车载摄像头下车辆检测系统(PyTorch+Pyside6+YOLOv7)
  • 深度学习(3)--递归神经网络(RNN)和词向量模型Word2Vec
  • 【江科大】STM32:中断系统(理论)
  • JAVA 学习 面试(六)数据类型与方法
  • Java 一个数组集合List<People> 赋值给另一个数组集合List<NewPeople> ,两个数组集合属性部分一致。
  • 基于神经网络的电力系统的负荷预测
  • OpenCV第 1 课 计算机视觉和 OpenCV 介绍
  • C++面试:stl的栈和队列介绍
  • 从0开始学习C++ 第十二课:指针强化
  • mongodb和python交互
  • 力扣279. 完全平方数
  • 【C++】list容器功能模拟实现
  • linux 安装ffmpeg
  • 激光雷达行业梳理2-产业链、公司、未来展望
  • Java 设计者模式以及与Spring关系(四) 代理模式
  • PHP编程实践:实际商品价格数据采集
  • 有效防范网络风险的关键措施