根据官方文档的描述,用Go语言编写的程序在运行的时候,对协程的调度是不确定的。也就是说某一个时间里,具体哪个协程在运行是不确定的。但是下面出现了一个反例:package main
import (
"fmt"
)
func main() {
c := make(chan string)
done := make(chan struct{})
go feed("cat", c, done)
go feed("dog", c, done)
c <- "fish"
<-done
}
func feed(name string, ch chan string, done chan struct{}) {
meat := <-ch
fmt.Println(name, "eat", meat)
done <- struct{}{}
}运行上面这段代码输出的总是cat eat fish。也就是说,每次都是cat那个协程可以拿到通道中的数据。而不是cat和dog随机从通道中拿到数据。这个现象和官方的描述是有出入的。但是对这段代码稍作改动,每次运行的时候,出现的结果就会是随机的,且看下面这段代码:package main
import (
"fmt"
"runtime"
)
func init(
...
继续阅读
(28)