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

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

1package main 2 3import ( 4 "fmt" 5 "math/rand" 6) 7 8func test(ch chan int, i int) { 9 ch <- rand.Int() 10 fmt.Println(i, "go...") 11} 12 13func main() { 14 chs := make([]chan int, 10) 15 for i := 0; i < 10; i++ { 16 chs[i] = make(chan int) 17 go test(chs[i], i) 18 } 19 for _, ch := range chs { 20 value := <-ch 21 fmt.Println(value) 22 } 23 var i int 24 fmt.Scan(&i) 25 fmt.Println("done") 26}

这个程序的输出是

10 go... 2134020434 31597969999 41721070109 52068675587 61237770961 7220031192 82031484958 9583324308 10958990240 11413002649 121 go... 132 go... 143 go... 154 go... 165 go... 176 go... 187 go... 198 go... 209 go...

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

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

三十分钟入门基础Go(Java小子版)

本篇文章适用于学习过其他面向对象语言(Java、Php),但没有学过Go语言的初学者。文章主要从Go与Java功能上的对比来阐述Go语言的基础语法、面向对象编程、并发与错误四个方面。

go中内存泄露的发现与排查

一,什么是内存泄漏Go中的并发性是以goroutine(独立活动)和channel(用于通信)的形式实现的。处理goroutine时,程序员需要小心翼翼地避免泄露。如果最终永远堵塞在I/O上(例如channel通信),或者陷入死循环,那么goroutine会发生泄露。即使是阻塞的goroutine,也会消耗资源

Golang- import 导入包的语法

一包的导入语法   在写Go代码的时候经常用到import这个命令用来导入包文件,看到的方式参考如下:   import(     "fmt"   )  然后在代码里面可以通过如下的方式调用   fmt.Println("helloworld")    上面这个fmt是Go语言的

Go并发(五):WaitGroup

本篇其实是Go并发编程的补充篇章,只是用来介绍WaitGroup的使用介绍。对于Go的并发编程来说,主协程需要知道其他的协程何时结束。通常我们的做法是采用channel的方式来控制,这种做法很好,可以参见我的另外一个帖子(Go并发之channel篇:https://mp.weixin.qq.com/s/PIbgGBootc6581pHhi5ew(h

Go语言规范(介绍)

Google发布Go语言已经有一段时间了,但是还少有在论坛看到关于Go的讨论,几个Go语言的BBS也冷冷清清的,国内程序员对Go语言似乎还持观望态度。在看了它的一点特性和一段时间的试用之后,我感受到了Go语言给我带来的乐趣,个人觉得Go语言以后将会有很好的发展前景,我已经是等不及了,我要好好学习一下这门语言,当然还有对里面的大牛们产生的崇拜!^\