Channel(一般简写为 chan) 管道提供了一种机制,它在两个并发执行的协程之间进行同步,并通过传递与该管道元素类型相符的值来进行通信。Channel 是用来在不同的 goroutine 中交换数据的,千万不要把 Channel 拿来在同一个 goroutine 中的不同函数之间间交换数据,chan 可以理解为一个管道或者先进先出的队列。
最简单形式: chan elementType
,通过这个类型的值,你可以发送和接收elementType 类型的元素。Channel 是引用类型,如果将一个 chan 变量赋值给另外一个,则这两个变量访问的是相同的 chann。
当然,我们可以用 make 分配一个channel:var c = make(chan int)
<-
和操作方式通信操作符 <-
的箭头指示数据流向,箭头指向哪里,数据就流向哪里,它是一个二元操作符,可以支持任意类型,对于 channel 的操作只有4种方式:
channel 分为有缓冲 channel 和无缓冲 channel,两种 channel 的创建方法如下:
写操作,什么时候会被阻塞?
读操作,什么时候会被阻塞?
close 操作,什么时候会被阻塞?
容量(capacity)代表 Channel 容纳的最多的元素的数量,代表Channel的缓存的大小。如果没有设置容量,或者容量设置为0, 说明 Channel 没有缓存,长度和容量的两个函数是 cap 和 len 。
示例如下:
c := make(chan int, 100) // cap 就是 100,但是此时 len 为 0
c <- 0 // len = 1, cap = 100
c <- 0 // len = 2, cap = 100
<- c // len = 1, cap = 100
Channel 的缺点:
channel 作为 Go 并发模型的核心思想:不要通过共享内存来通信,而应该通过通信来共享内存,那么在 Go 里面,当然也可以很方便通过 channel 来实现协程的并发和同步了,并且 channel 本身还可以支持有缓冲和无缓冲的,通过 channel + timeout 实现并发协程之间的同步也是常见的一种使用姿势。
示例如下:
package main
import "fmt"
func main() {
var ch = make(chan string)
for i := 0; i < 10; i++ {
go sum(i, i+10, ch)
}
for i := 0; i < 10; i++ {
fmt.Print(<-ch)
}
}
func sum(start, end int, ch chan string) {
var sum int = 0
for i := start; i < end; i++ {
sum += i
}
ch <- fmt.Sprintf("Sum from %d to %d is %d\n", start, end, sum)
}
message_chan := make(chan int, 2)
go func() {
time.Sleep(time.Second * 3)
println("start recv...")
println(<-message_chan)
println(<-message_chan)
println(<-message_chan)
println("finish recv...")
}()
println("start send 10...")
message_chan <- 10
println("start send 20...")
message_chan <- 20
println("start send 30...")
message_chan <- 30
println("finish send...")
time.Sleep(time.Second * 3)
close(message_chan)
Channels in Go(https://go101.org/article/channel.html)
How to Gracefully Close Channels(https://go101.org/article/channel-closing.html)
总结了才知道,原来channel有这么多用法!(https://lessisbetter.site/2019/01/20/golang-channel-all-usage/)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。