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

这是代码:


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")

}

意外打印


going

goroutine : 0

goroutine : 1

goroutine : 2

尽管 goroutine 的going调用晚于计数器。为什么?


慕无忌1623718
浏览 134回答 1
1回答

陪伴而非守候

多个 goroutine 之间没有执行顺序保证。只有当两个 goroutine 使用一个通道交换数据,或者使用另一个同步机制进行同步时,才能建立排序保证。在您的情况下,您碰巧观察到一个 goroutine 恰好在另一个之前运行的执行。当您多次运行它时,您可能会观察到不同的顺序。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go