前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go-并发编程-无缓冲和有缓冲 channel 的区别(一)

Go-并发编程-无缓冲和有缓冲 channel 的区别(一)

原创
作者头像
堕落飞鸟
发布2023-04-21 13:48:09
2990
发布2023-04-21 13:48:09
举报
文章被收录于专栏:飞鸟的专栏

Go 语言提供了一种称为 channel 的通信机制,可以用于协调并发执行的多个 goroutine。在 Go 中,channel 是一种特殊类型的变量,用于在 goroutine 之间进行通信。

channel 有两种类型:无缓冲 channel 和有缓冲 channel。它们之间有一些重要的区别。

无缓冲 channel

无缓冲 channel 也称为同步 channel,是指没有存储空间的 channel,每次发送和接收操作都会发生阻塞,直到发送者和接收者都准备好进行通信。

以下是使用无缓冲 channel 进行通信的例子:

代码语言:javascript
复制
package main

import "fmt"

func main() {
    ch := make(chan int)
    go func() {
        fmt.Println("sending 1")
        ch <- 1
        fmt.Println("sending 2")
        ch <- 2
    }()
    fmt.Println("receiving", <-ch)
    fmt.Println("receiving", <-ch)
}

在这个例子中,我们创建了一个无缓冲 channel ch,然后启动了一个 goroutine,在这个 goroutine 中向 channel 中发送了两个数值。然后我们在主 goroutine 中接收这两个数值并打印输出。

输出结果为:

代码语言:javascript
复制
sending 1
receiving 1
sending 2
receiving 2

从输出结果可以看出,发送操作和接收操作是成对出现的。每次发送操作都会被阻塞,直到另一个 goroutine 接收这个值。同样,每次接收操作也会被阻塞,直到另一个 goroutine 发送一个值。

在无缓冲 channel 中,发送操作和接收操作是同步的,即它们都会等待对方就绪才能完成。这种同步机制可以保证通信的顺序和可靠性,但是也会增加系统的复杂度和运行时的开销。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 无缓冲 channel
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档