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 —— 并发与并行

go语言学习笔记 — 进阶 — 并发编程:为函数创建goroutine

go语言学习笔记 — 进阶 — 并发编程:调整并发的运行性能(GOMAXPROCS)