前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go的并发模型:Goroutines和Channels

Go的并发模型:Goroutines和Channels

作者头像
运维开发王义杰
发布2023-08-10 18:11:14
1520
发布2023-08-10 18:11:14
举报

欢迎回到我们的Go专栏!在这篇文章中,我们将详细讨论Go语言的并发模型,重点是 Goroutines 和 Channels。

1. Goroutines

Goroutine 是 Go 语言中并发设计的核心。你可以把它理解为一个轻量级的线程。当我们启动一个函数作为 Goroutine 时,Go 会在一个新的 Goroutine 中运行这个函数,而不会阻塞当前的执行流程。

以下是一个 Goroutine 的基本示例:

代码语言:javascript
复制
package main

import (
    "fmt"
    "time"
)

func say(s string) {
    for i := 0; i < 3; i++ {
        time.Sleep(100 * time.Millisecond)
        fmt.Println(s)
    }
}

func main() {
    go say("world")
    say("hello")
}

在这个例子中,say("world")在一个新的 Goroutine 中运行,而say("hello")在当前的 Goroutine 中运行。

2. Channels

Channels 是 Go 中的一种类型,可以用于在 Goroutines 之间安全地传递数据。一个 Channel 是一个通道,可以通过它发送和接收值。

以下是一个 Channels 的基本示例:

代码语言:javascript
复制
package main

import "fmt"

func sum(s []int, c chan int) {
    sum := 0
    for _, v := range s {
        sum += v
    }
    c <- sum // send sum to c
}

func main() {
    s := []int{7, 2, 8, -9, 4, 0}

    c := make(chan int)
    go sum(s[:len(s)/2], c)
    go sum(s[len(s)/2:], c)
    x, y := <-c, <-c // receive from c

    fmt.Println(x, y, x+y)
}

在这个例子中,我们创建了一个新的 Channel c,然后在两个 Goroutine 中计算 s 的和,并将结果发送到 c。在主 Goroutine 中,我们从 c 中接收并打印这两个结果。

3. Goroutines 和 Channels 的配合使用

Goroutines 和 Channels 一起使用时,可以编写出强大、高效和简洁的并发代码。这也是 Go 语言最显著的特性之一。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维开发王义杰 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. Goroutines
  • 2. Channels
  • 3. Goroutines 和 Channels 的配合使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档