这是代码: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 恰好在另一个之前运行的执行。当您多次运行它时,您可能会观察到不同的顺序。
- 1 回答
- 0 关注
- 133 浏览
添加回答
举报
0/150
提交
取消