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 循环 可以不用关闭

Go 复制代码
package main

import "fmt"

func main() {
	var ch1 = make(chan int, 10)
	for i := 0; i < 10; i++ {
		ch1 <- i
	}
	close(ch1)               //关闭管道
	for value := range ch1 { //管道没有key
		fmt.Println(value)
	}
}
5、管道和goroutine结合使用
Go 复制代码
package main

import (
	"fmt"
	"sync"
	"time"
)

var wg sync.WaitGroup

func writeData(ch chan int) {
	for i := 0; i < 10; i++ {
		ch <- i
		fmt.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:

默认操作

}

相关推荐
paterWang1 小时前
基于 Python 和 OpenCV 的酒店客房入侵检测系统设计与实现
开发语言·python·opencv
东方佑1 小时前
使用Python和OpenCV实现图像像素压缩与解压
开发语言·python·opencv
饮长安千年月1 小时前
Linksys WRT54G路由器溢出漏洞分析–运行环境修复
网络·物联网·学习·安全·机器学习
红花与香菇2____1 小时前
【学习笔记】Cadence电子设计全流程(二)原理图库的创建与设计(上)
笔记·嵌入式硬件·学习·pcb设计·cadence·pcb工艺
我真不会起名字啊2 小时前
“深入浅出”系列之杂谈篇:(3)Qt5和Qt6该学哪个?
开发语言·qt
laimaxgg2 小时前
Qt常用控件之单选按钮QRadioButton
开发语言·c++·qt·ui·qt5
水瓶丫头站住2 小时前
Qt的QStackedWidget样式设置
开发语言·qt
小钊(求职中)3 小时前
Java开发实习面试笔试题(含答案)
java·开发语言·spring boot·spring·面试·tomcat·maven
一天八小时4 小时前
Docker学习进阶
学习·docker·容器
前端没钱4 小时前
前端需要学习 Docker 吗?
前端·学习·docker