```go
package main
import(
"fmt"
"sync"
)
var ch1 =make(chan int)
const(
nums="123456789"
letters="abcdefghi"
)
func main(){
wd:=sync.WaitGroup{}
wd.Add(len(nums)+len(letters))
fun1:=func(){
for _,v:=range nums{
ch1<-1
fmt.Print(string(v))
wd.Done()
}
ch1<-1
}
fun2:=func(){
for _,v:=range letters{
<-ch1
fmt.Print(string(v))
wd.Done()
}
}
go fun1()
go fun2()
wd.Wait()
}
```
这段代码感觉打印结果应该是:1a2b3c4d5e6f7g8h9i
实际结果:a12bc34de56fg78hi9
每个goroutine的执行顺序是不确定的,并不是谁先启动就谁先执行,我在https://play.golang.org/上运行的结果还是这样的呢:1ab23cd45ef67gh89i
#1
更多评论
```go
package main
import (
"fmt"
"sync"
)
const (
nums = "123456789"
letters = "abcdefghi"
)
func main() {
ch1 := make(chan int)
ch2 := make(chan int)
wd := sync.WaitGroup{}
wd.Add(len(nums) + len(letters))
fun1 := func() {
for _, v := range nums {
<-ch2
fmt.Print(string(v))
wd.Done()
ch1 <- 1
}
}
fun2 := func() {
for _, v := range letters {
<-ch1
fmt.Print(string(v))
wd.Done()
ch2 <- 1
}
}
go fun1()
go fun2()
ch2 <- 1
wd.Wait()
}
```
#2
goroutine是随机的,所以在多核的环境里你每次得到的顺序都可能不一样,如果你想固定下来,加一句话```runtime.GOMAXPROCS(1)``` ok,每次都一样了,因为协程再并发CPU执行都是顺序的,你限制只使用单核,那就是老老实实的顺序执行了,嘿嘿。
#3