Go-并发编程-无缓冲和有缓冲 channel 的区别(二)
有缓冲 channel
有缓冲 channel 是指带有一定存储空间的 channel,发送和接收操作不一定需要同步进行。当缓冲区未满时,发送操作会立即返回,并将数据存储在缓冲区中,而接收操作则会等待直到缓冲区中有数据可用。当缓冲区已满时,发送操作将被阻塞,直到缓冲区中有空闲位置可用。
以下是使用有缓冲 channel 进行通信的例子:
package main
import "fmt"
func main() {
ch := make(chan int, 2)
ch <- 1
ch <- 2
fmt.Println("receiving", <-ch)
fmt.Println("receiving", <-ch)
}
在这个例子中,我们创建了一个带有 2 个存储空间的有缓冲 channel ch
,然后向 channel 中发送了两个数值,并在主 goroutine无缓冲 channel 是指在 channel 中只能存储一个值,即该 channel 的容量为 0。如果有 goroutine 向一个未被接收的无缓冲 channel 中发送值,那么该 goroutine 会一直阻塞,直到有另一个 goroutine 从该 channel 中接收该值。这种阻塞的机制使得 goroutine 的执行是同步的,即发送和接收操作在 channel 上是同步的。
下面是一个使用无缓冲 channel 的例子:
package main
import "fmt"
func main() {
c := make(chan int) // 创建一个无缓冲 channel
go func() {
fmt.Println("Start goroutine")
c <- 1 // 向 channel 发送值
fmt.Println("End goroutine")
}()
fmt.Println("Start main")
v := <-c // 从 channel 中接收值
fmt.Println("Received", v)
fmt.Println("End main")
}
输出结果为:
Start main
Start goroutine
Received 1
End main
End goroutine
在 main 函数中,先创建了一个无缓冲 channel c,并启动了一个新的 goroutine,该 goroutine 向 channel 中发送了值 1。然后,main 函数中的代码从 channel 中接收值,并将其打印出来。在这个过程中,main 函数会一直阻塞,直到从 channel 中接收到值。接着,goroutine 中的代码继续执行,将打印出 End goroutine。
由于无缓冲 channel 在发送和接收操作上是同步的,因此在这个例子中,Start goroutine 和 Start main 的输出顺序是不确定的。因为无缓冲 channel 保证了发送和接收操作的同步,所以这个例子中的输出结果是正确的,而不会出现类似数据竞争的问题。
相关文章
- 史上最全的Go语言模块(Module)管理详解(基于Go1.19)
- 2022-10-02:以下go语言代码能否通过编译?A: 能;B: 不能;C: 不知道。 package main import ( “fmt“ ) type
- 2022-09-02:以下go语言代码输出什么?A:9;B:11;C:编译错误;D:不确定。package mainimport
- Go 并发安全与锁
- 不背锅运维:上篇:Go并发编程
- 「Go工具箱」推荐一个变量调试神器:go-spew
- 「Go工具箱」将文件大小转换成Kb、Mb、Gb就用这个库:go-humanize
- 「Go工具箱」一个对语义化版本进行解析、比较的库:go-version
- GO语言开篇-Go语言急速入门(基础知识点)| 青训营笔记
- 开心档之Go 并发
- Go 模块 verifying xxx/go.mod: checksum mismatch 问题处理
- 每日优鲜回应清退解散;国内Go语言爱好者发起新编程语言;微信安装包11年膨胀575倍|Q资讯
- Go语言——并发编程
- Go-并发编程-无缓冲和有缓冲 channel 的区别(一)
- Go-标准库-text(二)
- Go-包管理-go get(一)
- Go Mutex:保护并发访问共享资源的利器
- go pprof命令(Go语言性能分析命令)完全攻略
- Go语言圣经–示例: 并发的Echo服务详解编程语言
- Go语言圣经-匿名函数习题详解编程语言
- GO语言圣经-并发获取多个URL详解编程语言
- 使用Go语言来操作Oracle数据库(go语言oracle)
- Go-统一定义 API 错误码-Gin开发详解编程语言
- Go—go-cache包学习详解编程语言
- go语言的并发详解编程语言
- 以Go语言操作MySQL:轻松运行数据库各种查询(go语言mysql)
- Go语言搭建Oracle数据库快速连接方法(go语言连接oracle)
- 快跟上趋势,GO DB ORACLE(go db oracle)
- 语句使用Oracle中的Go语句来简化编程(oracle中go)
- GO语言并发编程之互斥锁、读写锁详解