初学Go语言,对channel、并发的思考

科工人 等级 255 0 0

初学go语言,对channel、并发感觉不太好理解。希望高人指点下。
下面的代码是我看到一本书上的,就是讲解channel的。

package main

import (
    "fmt"
    "math/rand"
)

func test(ch chan int, i int) {
    ch <- rand.Int()
    fmt.Println(i, "go...")
}

func main() {
    chs := make([]chan int, 10)
    for i := 0; i < 10; i++ {
        chs[i] = make(chan int)
        go test(chs[i], i)
    }
    for _, ch := range chs {
        value := <-ch
        fmt.Println(value)
    }
    var i int
    fmt.Scan(&i)
    fmt.Println("done")
} 

这个程序的输出是

0 go...
134020434
1597969999
1721070109
2068675587
1237770961
220031192
2031484958
583324308
958990240
413002649
1 go...
2 go...
3 go...
4 go...
5 go...
6 go...
7 go...
8 go...
9 go... 

我的疑惑是,为什么第一个打印出来的是0 go...?
我想来想去还觉得应该是先输出随机数,然后才输出0 go..., 1 go..., 2 go..., .........呀。
如果先打印了0 go...,那么后面的1 go...,2 go...不是也应该和随机数间隔打印出来吗?

收藏
评论区