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:

默认操作

}

相关推荐
matlab代码12 分钟前
基于matlab PCA人脸识别系统【源码63期】
开发语言·matlab
Terra.K12 分钟前
后端开发阶段性总结
java·开发语言·后端
clorinda13 分钟前
PyTorch 手写数字识别学习笔记
pytorch·笔记·学习
学逆向的15 分钟前
PE——合并节
开发语言·网络安全·pe
是个西兰花18 分钟前
C++11:线程库与线程安全问题
开发语言·c++
m4Rk_19 分钟前
【论文阅读】Agent 记忆机制(63):SAMem——把经验记忆细化为带长期价值的状态—Thought
论文阅读·人工智能·学习·开源·github
点心的游戏开发世界20 分钟前
GDScript 入门笔记(十三):字符串操作
开发语言·笔记·游戏引擎·godot
少司府30 分钟前
C++进阶:智能指针
开发语言·数据结构·c++·b树·算法·c·智能指针
matlab代码32 分钟前
基于matlab的红绿灯图像检测识别系统【源码60期】
开发语言·matlab
kyrie_sakura35 分钟前
MySQL数据库学习笔记1 -- 基础概念,sql语句
数据库·学习·mysql