返回介绍

channels

发布于 2024-10-12 12:35:56 字数 1396 浏览 0 评论 0 收藏 0

goroutine 运行在相同的地址空间,因此访问共享内存必须做好同步。那么 goroutine 之间如何进行数据的通信呢,Go 提供了一个很好的通信机制 channelchannel 可以与 Unix shell 中的双向管道做类比:可以通过它发送或者接收值。这些值只能是特定的类型: channel 类型 。定义一个 channel 时,也需要定义发送到 channel 的值的类型。注意,必须使用 make 创建 channel

ci := make(chan int)
cs := make(chan string)
cf := make(chan interface{})

channel 通过操作符 <- 来接收和发送数据

ch <- v    // 发送 v 到 channel ch.
v := <-ch  // 从 ch 中接收数据,并赋值给 v

把这些应用到例子中来:

package main
import "fmt"
func sum(a []int, c chan int) {
    total := 0
    for _, v := range a {
        total += v
    }
    c <- total  // send total to c
}
func main() {
    a := []int{7, 2, 8, -9, 4, 0}
    c := make(chan int)
    go sum(a[:len(a)/2], c)
    go sum(a[len(a)/2:], c)
    x, y := <-c, <-c  // receive from c
    fmt.Println(x, y, x + y)
}

默认情况下, channel 接收和发送数据都是阻塞的,除非另一端已经准备好,这样就使得 Goroutines 同步变的更加的简单,而不需要显式的 lock 。所谓阻塞,也就是如果读取( value := <-ch )它将会被阻塞,直到有数据接收。其次,任何发送( ch<-5 )将会被阻塞,直到数据被读出。无缓冲 channel 是在多个 goroutine 之间同步很棒的工具。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文