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:

默认操作

}

相关推荐
大黄说说几秒前
C++20 协程从入门到网络服务
开发语言
你是个什么橙2 分钟前
Python入门学习2:Python 基础语法全解析——从代码结构到输入输出
开发语言·python·学习
小白学大数据4 分钟前
Python + 大模型行业资讯自动化摘要流水线完整工程实现方案
开发语言·python·自动化
宝贝儿好5 分钟前
【LLM】第二章:HuggingFace入门学习
人工智能·深度学习·神经网络·学习·算法·自然语言处理
秋波。未央9 分钟前
Java Agent 开发 · Day 1 学习笔记(含作业完整标准答案)
java·笔记·学习
何以解忧,唯有..12 分钟前
Go语言中的const:常量声明与iota枚举详解
java·开发语言·golang
沪飘大军19 分钟前
goldRush-专门分析黄金的投资理财agent
java·开发语言·elasticsearch
beethobe28 分钟前
PythonQt 学习之旅(一):从零构建 C++ 与 Python 的桥梁
c++·python·学习
鹏易灵32 分钟前
C++——2.常量与 const、constexpr 初识详解
java·开发语言·c++
如果你想拥有什么先让自己配得上拥有44 分钟前
创业全周期证券学习法评价与系统观分析
学习