package main
import (
"fmt"
"time"
)
var message chan string
func main() {
message = make(chan string)
count := 6
flag := "first"
go func() {
fmt.Println("child go ",flag)
for i := 0; i < count; i++ {
fmt.Println("set:",i)
message <- fmt.Sprintf("message %d",i)
}
}()
time.Sleep(time.Second * 0)
fmt.Println("main thread ",flag)
flag = "last"
for i := 0 ; i < count; i++ {
fmt.Println("get:",i)
fmt.Println(<-message)
}
}
我运行代码,结果是:
main thread first
get: 0
child go last
set: 0
set: 1
message 0
get: 1
message 1
get: 2
set: 2
set: 3
message 2
get: 3
message 3
get: 4
set: 4
set: 5
message 4
get: 5
message 5
我对结果感到困惑。为什么在“get 1”之后出现“message 1”而不是“set 2”?这让我困惑了好几天!
我认为当它“获取 1”时,应该阻止主 go 例程并且应该执行子 go 例程,将“消息 1”发送到通道消息并继续 for 循环并打印“设置 2”,因此被阻止将“消息 2”发送到通道,因此主 go 例程开始运行,输出“消息 1”。