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:

默认操作

}

相关推荐
ZTLJQ17 小时前
序列化的艺术:Python JSON处理完全解析
开发语言·python·json
2401_8914821717 小时前
多平台UI框架C++开发
开发语言·c++·算法
88号技师17 小时前
2026年3月中科院一区SCI-贝塞尔曲线优化算法Bezier curve-based optimization-附Matlab免费代码
开发语言·算法·matlab·优化算法
t1987512817 小时前
三维点云最小二乘拟合MATLAB程序
开发语言·算法·matlab
nap-joker17 小时前
【多模态解耦】DecAlign:用于解耦多模态表示学习的分层跨模态对齐
学习·多模态融合·最优传输·多模态表征学习·特征解耦·音频+图像+文本·原型引导
551只玄猫18 小时前
【数据库原理 实验报告1】创建和管理数据库
数据库·sql·学习·mysql·课程设计·实验报告·数据库原理
m0_7269659818 小时前
面面面,面面(1)
java·开发语言
IDZSY043018 小时前
AI社交平台进阶指南:如何用AI社交提升工作学习效率
人工智能·学习
happymaker062618 小时前
web前端学习日记——DAY05(定位、浮动、视频音频播放)
前端·学习·音视频
2401_8319207418 小时前
分布式系统安全通信
开发语言·c++·算法