go语言学习笔记 — 进阶 — 并发编程:通道(channel) —— 在多个goroutine之间通信的管道
Posted Locutus
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go语言学习笔记 — 进阶 — 并发编程:通道(channel) —— 在多个goroutine之间通信的管道相关的知识,希望对你有一定的参考价值。
单纯地并发执行函数是无意义的,函数之间需要交换数据才能体现并发执行的意义。
虽然可以使用“共享内存”的方式交换数据,但共享内存在不同goroutine间易发生竞态问题。为了保证数据交换的正确性,必须使用互斥量对内存加锁,这会增加额外的时间开销。
go使用通道channel来实现goroutine之间的通信。
在食堂、地铁站等公共场所,很多人养成排队的习惯,目的是避免拥挤、插队导致的低效资源使用与交换,同理,代码和数据也是如此。多个goroutine争抢数据,会造成低效率的代码执行,使用队列是最高效的,channel就是一种队列结构。
1.1 通道的特性
-
go的channel是一种特殊的类型
-
在任何时候,同时只能有一个goroutine访问通道,进行收发数据
-
goroutine间通过channel实现通信
-
channel像一个传送带或队列,总是遵循先入先出(FIFO)的规则,保证收发数据的顺序
1.2 声明通道类型
通道需要指定一个类型,用来修饰元素,就像切片slice需要标识元素类型。通道元素类型就是在channel内部传输的数据类型。通道变量用于保存通道。
- 格式
var 通道变量 chan 通道类型
通道类型的零值是nil。声明通道类型后,需要配合使用make创建通道,才能使用。
1.3 创建通道(常用)
channel是引用类型,需要使用make进行创建。
- 格式
通道实例 := make(chan 数据类型)
数据类型是通道内传输的元素类型;通道实例是make创建的通道句柄。
- 实例
ch1 := make(chan int) // 创建整型类型的channel,可以存放int类型数据
ch2 := make(chan interface{}) // 创建空接口类型的channel,可以存放任何类型数据
type Equip struct{}
ch3 := make(chan *Equip) // 创建Equip指针类型的channel,可以存放*Equip结构体指针类型
以上是关于go语言学习笔记 — 进阶 — 并发编程:通道(channel) —— 在多个goroutine之间通信的管道的主要内容,如果未能解决你的问题,请参考以下文章
go语言学习笔记 — 进阶 — 并发编程:通道(channel) —— 在多个goroutine之间通信的管道
go语言学习笔记 — 进阶 — 并发编程:同步sync,竞态检测 —— 检测代码在并发环境下出现的问题
go语言学习笔记 — 进阶 — 并发编程(11):同步sync,等待组(sync.WaitGroup)—— 保证在并发环境中完成指定数量的任务
go语言学习笔记 — 进阶 — 并发编程:轻量级线程goroutine —— 并发与并行