为了账号安全,请及时绑定邮箱和手机立即绑定

goroutine 调用行之后的行是否比 goroutine 的第一行更早开始?

goroutine 调用行之后的行是否比 goroutine 的第一行更早开始?

Go
慕无忌1623718 2022-06-01 18:18:53
这是代码:import "fmt"func main() {    messages := make(chan string, 1)    go func(c chan string) {        c <- "Hi"    }(messages)    select {    case msg := <-messages:        fmt.Println("received message", msg)    default:        fmt.Println("no message received")    }}它输出no message received. 或者这段代码:import (    "fmt"    "time")func f(from string) {    for i := 0; i < 3; i++ {        fmt.Println(from, ":", i)    }}func main() {    go f("goroutine")    go func(msg string) {        fmt.Println(msg)    }("going")    time.Sleep(time.Second)    fmt.Println("done")}意外打印goinggoroutine : 0goroutine : 1goroutine : 2尽管 goroutine 的going调用晚于计数器。为什么?
查看完整描述

1 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

多个 goroutine 之间没有执行顺序保证。只有当两个 goroutine 使用一个通道交换数据,或者使用另一个同步机制进行同步时,才能建立排序保证。在您的情况下,您碰巧观察到一个 goroutine 恰好在另一个之前运行的执行。当您多次运行它时,您可能会观察到不同的顺序。



查看完整回答
反对 回复 2022-06-01
  • 1 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号