go学习笔记
基础
go 定义变量的几种方式
常量的声明
go基本数据类型
go语言中的流程控制
golang中的数组
切片
golang中的map 详解
golang 函数详解
内置函数 panic/recover
golang time包 以及日志函数
golang中的指针
golang 中的结构体
Golang 结构体 和 json互相转换 序列化 反序列化
Golang 中的 go mod 以及 Golang包 详解
golang 中的接口
golang goroutine channel 实现并发 和 并行
channel
goroutine 互斥锁 读写互斥锁
golang 反射
golang 标准库
io
strconv
工具 + blog
进程 线程 协程
空接口 类型断言
为Go项目编写Makefile
减小 Go 代码编译后的二进制体积
go windows下编译linux可执行文件
本文档使用 MrDoc 发布
-
+
首页
channel
## channel 管道 管道是Golang在语言级别上提供的goroutine间的通讯方式,我们可以使用channel在多个goroutine之间传递消息。如果说goroutine是Go程序并发的执行体,channel就是它们之间的链接。channel是可以让一个goroutine发送特定值到另一个goroutine的通信机制。 Golang的并发模型是CSP,提倡 通过通信共享内存 而不是 通过共享内存而实现通信。 Go语言中的管道(channel)是一种特殊的类型。管道像一个传送带或者队列,总是遵循**先入先出**的原则,保证收发数据的顺序。每一个管道都是一个具体类型的管道,也就是声明channel的时候需要为其指定元素类型。 ## channel 类型 channel 是一种类型,一种引用类型。 声明管道类型的格式如下: ``` var 变量 chan 元素类型 var ch1 chan int //传递int类型的管道 var ch2 chan string var ch3 chan []int ``` ## 创建 channel 声明的管道后需要使用make函数初始化之后才能使用。 ``` make(chan 元素类型,容量) ``` ### 1发送(将数据放在管道内) 将一个值发送到管道中 ``` ch <- 10 //把10发送到ch中 ``` ### 2接受(从管道内取值) 从一个管道中接收值。 ``` x := <- ch ``` ### 3关闭通道 我们可以使用内置函数关闭 channel ``` close(channel) ``` ## for range 遍历 channel ``` func main() { c := make(chan int, 10) for i := 0; i < cap(c); i++ { c <- i } close(c) //遍历chan前 需要先close chan 不然会报dead lock for v := range c { //chan 没有key fmt.Printf("v: %v\n", v) } } ``` 实例 ``` var swait sync.WaitGroup func inChan(c chan int) { for i := 0; i < cap(c); i++ { c <- i fmt.Println("向chan 写入", i) time.Sleep(time.Second * 2) } close(c) swait.Done() } func outChan(c chan int) { for v := range c { fmt.Printf("向chan读取 %v \n", v) time.Sleep(time.Second * 3) } swait.Done() } func main() { c := make(chan int, 10) fmt.Printf("len(c): %v\n", cap(c)) swait.Add(1) go inChan(c) swait.Add(1) go outChan(c) swait.Wait() fmt.Println("主线程退出") } ``` ## 单向管道 有的时候我们会将管道作为参数在多个任务函数间传递,很多时候我们在不同的任务函数中使用管道都会对其进行限制,比如限制管道在函数中只能发送或只能接收。 ``` //在默认情况下,管道是双向 //var chan1 chan int 可读可写 //2 声明为只写 var chan2 chan <-int chan2 = make(chan int,3) chan2 <- 20 //3 声明只读管道 ch3 =make(<-chan int,2) ```
admin
2022年8月17日 16:32
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码