Golang通道,执行顺序

2023-12-25

我正在学习 Go,并且遇到了以下代码片段:

package main

import "fmt"

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

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

    c := make(chan int, 2)
    go sum(a[0:3], c)
    go sum(a[3:6], c)
    x := <-c
    y := <-c
    // x, y := <-c, <-c // receive from c

    fmt.Println(x, y)
}

Output:

-5 17

Program exited.

有人可以告诉我为什么“sum”函数的第二次调用是在第一次调用之前通过通道进行的吗?在我看来,输出应该是:

17 -5

我还使用非缓冲通道对此进行了测试,它也给出了相同的输出顺序。我缺少什么?


您在代码中调用 go 例程,并且无法判断例程何时结束以及值何时将传递到缓冲通道。

由于此代码是异步的,因此每当例程完成时,它都会将数据写入通道并在另一端读取。在上面的示例中,您仅调用两个 go 例程,因此行为是确定的,并且在大多数情况下都会以某种方式生成相同的输出,但是当您增加 go 例程时,输出将不相同,并且顺序将不同,除非您使它是同步的。

Example:

package main

import "fmt"

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

func main() {
    a := []int{7, 2, 8, -9, 4, 2, 4, 2, 8, 2, 7, 2, 99, -32, 2, 12, 32, 44, 11, 63}

    c := make(chan int)
    for i := 0; i < len(a); i = i + 5 {
        go sum(a[i:i+5], c)
    }
    output := make([]int, 5)
    for i := 0; i < 4; i++ {
        output[i] = <-c
    }
    close(c)

    fmt.Println(output)
}

此代码在不同示例运行中的输出为

[12 18 0 78 162] 

[162 78 12 0 18]

[12 18 78 162 0]

这是因为 goroutine 将输出异步写入缓冲通道。

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Golang通道,执行顺序 的相关文章

随机推荐

  • 用于循环赛的Python程序

    我正在编写一个程序 允许用户输入甚至数量的玩家 然后它将生成循环赛时间表 n 2 n 1游戏数量 以便每个玩家都与其他玩家进行比赛 现在我很难生成用户输入的玩家数量列表 我收到此错误 类型错误 int 对象不可迭代 我在我的程序中经常遇到这
  • 使用图像进行相似图像搜索

    我正在开发一个项目 其中将检查两个图像的相似性 例如 Google Image Search by image 我通过 Google 以及包括 stackoverflow 在内的各种网站进行了搜索 并了解了各种技术 例如直方图 筛选 傅里叶
  • Android 工作室:java.lang.NoClassDefFoundError

    我已将我的项目从 Eclipse 导入到 Android Studio 并且它在 Lollipop 设备上运行 如果我在 kitkat 设备上运行 它会给我 未找到类定义 异常 在我的项目中我有两个包1 com qapp它具有核心功能类和2
  • 来自解构函数的调试断言失败 BLOCK_TYPE_IS_VALID(pHead->nblockuse)

    我现在很迷失 我做了一个向量类 一切都按照我希望的方式进行 直到最后 调用析构函数时 我收到一条错误消息 调试断言失败 BLOCK TYPE IS VALID pHead gt nblockuse 我在 SO 上看到过很多像这样的问题 但我
  • SQL Server T-SQL 中的整数最大值常量?

    T SQL 中是否有像其他语言中的常量一样提供数据类型 例如 int 的最大值和最小值范围 我有一个代码表 其中每一行都有一个上限和下限列 我需要一个条目来表示一个范围 其中上限是 int 可以容纳的最大值 有点像黑客无穷大 我不想对其进行
  • 通过 Javascript 缓存与在服务器中设置 HTTPResponse 标头有什么区别

    在前端 我使用 AngularJS resource 进行 GET 请求 在后端 我使用 SpringMVC 以 Restful 方式公开我的方法 现在我想缓存只有一些 of my GET要求 我注意到有一些方法可以做到这一点 例如使用 c
  • 如何以编程方式填充使用 React 构建的输入元素?

    我的任务是抓取用 React 构建的网站 我正在尝试填写输入字段并使用 javascript 注入到页面 移动设备中的 selenium 或 webview 提交表单 这对其他所有网站 技术来说都是一种魅力 但 React 似乎是一个真正的
  • 从 Web 应用程序中删除经过 Firebase 身份验证的用户

    我想添加选项以从我的 Web 应用程序中从经过 Firebase 身份验证的用户列表中删除用户 我使用的身份验证方法是电子邮件和密码身份验证 该应用程序是移动单页应用程序 基于js html css 文件 浏览器应用程序 我可以使用 fir
  • LINQ TO Nhibernate 计数

    我正在尝试使用 LINQ to Nhibernate 来获取数据库中表的计数 但是 我正在运行的代码是拉回表中的所有记录 而不是从表中运行 select count 这是我的代码 public int GetTotalCount Func
  • 我需要将 strtol 的结果转换为 int 吗?

    以下代码不会对 g 4 1 1 发出警告 并且 Wall int octalStrToInt const std string s return strtol s c str 0 8 我期待一个警告 因为 strtol 返回一个long i
  • LINQ 表达式树是真正的树吗?

    LINQ 表达式树是否是正确的树 如图中所示 有向或无向 维基百科似乎不太同意 而没有循环 以下 C 表达式的表达式树的根是什么 string s gt s Length 表达式树如下所示 其中 gt 表示可访问其他节点的节点的属性名称 g
  • ngOninit 变量未在 html Angular 4 中绑定

    在谷歌地图上工作 能够显示地图 我想显示当前位置但不显示 export class AppComponent title ngOnInit if navigator geolocation navigator geolocation get
  • Xml 中的非法字符

    我有一个 PHP 文件 它根据从多个来源导入的数据生成 Xml 站点地图 由于导入数据的一行中存在非法字符 我的站点地图目前格式不正确 但我正在努力将其删除 该字符看起来代表 平方 或上标 2 并且被表示为正方形 我尝试将其粘贴到十六进制编
  • Glide - 如何并行加载多个图像?

    我正在尝试一个简单的测试 MainActivity java public class MainActivity extends AppCompatActivity private static final int N 20 private
  • numeric_limits::digits10 的含义是什么

    numeric limits digits10 的确切含义是什么 stackoverflow中的一些其他相关问题让我认为这是双精度的最大精度 但是 当精度大于 17 2 numeric limits digits10 时 以下原型开始工作
  • 向某些用户显示管理消息的最佳方式?

    我正在用 PHP MySQL jQuery 构建一个社交网站 用户登录我的网站后 我想查询数据库并获取管理员公告 如果存在 这将是一个消息框 在页面上向所有用户显示 但它会有一个X单击它并且不再显示它 直到管理员发布新的公告消息 因此 如果
  • 等到线程执行结束后再执行下一个方法

    我有一个 JFrame 子类 它管理我的 UI 并调用 Item 对象的方法来导入数据库中的项目 public TestGUI throws IOException initComponents Item importItems progr
  • 带有自定义cacheResolver的spring缓存

    我想要动态缓存名称和 spring4 1 允许 http docs spring io spring docs current spring framework reference html cache html 从 Spring 4 1
  • 加载 MySQLdb 模块时出错:libmysqlclient.so.20:无法打开共享对象文件:没有这样的文件或目录

    我有一个正在运行的 django 项目 由于某些原因 我必须删除当前的 mysql 版本并在我的计算机中安装不同的 MySQL 版本 但现在当我尝试运行该程序时出现如下错误 raise ImproperlyConfigured Error
  • Golang通道,执行顺序

    我正在学习 Go 并且遇到了以下代码片段 package main import fmt func sum a int c chan int sum 0 for v range a sum v c lt sum send sum to c