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

科工人
• 阅读 1482

初学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...不是也应该和随机数间隔打印出来吗?

点赞
收藏
评论区
推荐文章
三十分钟入门基础Go(Java小子版)
本篇文章适用于学习过其他面向对象语言(Java、Php),但没有学过Go语言的初学者。文章主要从Go与Java功能上的对比来阐述Go语言的基础语法、面向对象编程、并发与错误四个方面。
Wesley13 Wesley13
3年前
go中内存泄露的发现与排查
一,什么是内存泄漏Go中的并发性是以goroutine(独立活动)和channel(用于通信)的形式实现的。处理goroutine时,程序员需要小心翼翼地避免泄露。如果最终永远堵塞在I/O上(例如channel通信),或者陷入死循环,那么goroutine会发生泄露。即使是阻塞的goroutine,也会消耗资源
Stella981 Stella981
3年前
Golang- import 导入包的语法
一包的导入语法   在写Go代码的时候经常用到import这个命令用来导入包文件,看到的方式参考如下:   import(     "fmt"   )  然后在代码里面可以通过如下的方式调用   fmt.Println("helloworld")    上面这个fmt是Go语言的
Stella981 Stella981
3年前
Go并发(五):WaitGroup
本篇其实是Go并发编程的补充篇章,只是用来介绍WaitGroup的使用介绍。对于Go的并发编程来说,主协程需要知道其他的协程何时结束。通常我们的做法是采用channel的方式来控制,这种做法很好,可以参见我的另外一个帖子(Go并发之channel篇:https://mp.weixin.qq.com/s/PIbgGBootc6581pHhi5ew(h
Stella981 Stella981
3年前
Go 用 interface 模拟多态
多态是C这种语言中的概念,是指对不同的子类对象运行自己定义的方法。在Go语言中没有类的概念,但仍然可以使用structinterface来模拟实现类的功能。下面这个例子演示如何使用Go来模拟C中的多态行为。packagemainimport"fmt"//首先定义了一
Wesley13 Wesley13
3年前
Go语言规范(介绍)
Google发布Go语言已经有一段时间了,但是还少有在论坛看到关于Go的讨论,几个Go语言的BBS也冷冷清清的,国内程序员对Go语言似乎还持观望态度。在看了它的一点特性和一段时间的试用之后,我感受到了Go语言给我带来的乐趣,个人觉得Go语言以后将会有很好的发展前景,我已经是等不及了,我要好好学习一下这门语言,当然还有对里面的大牛们产生的崇拜!^\
可莉 可莉
3年前
10. Go 语言流程控制:for 循环
Hi,大家好,我是明哥。在自己学习Golang的这段时间里,我写了详细的学习笔记放在我的个人微信公众号《Go编程时光》,对于Go语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习Go语言,不防关注一下,一起学习,一起成长。我的在线博客:http://golang.iswbm.com(https://
小万哥 小万哥
1年前
Go 语法
一个Go文件包含以下几个部分:包声明导入包函数语句和表达式看下面的代码,更好地理解它:例子Gopackagemainimport"fmt"funcmain()fmt.Println("HelloWorld!")例子解释第1行:在Go中,每个程序都是一个包的
小万哥 小万哥
10个月前
Go 语言基础:包、函数、语句和注释解析
一个Go文件包含以下几个部分:包声明导入包函数语句和表达式看下面的代码,更好地理解它:例子gopackagemainimport"fmt"funcmain()fmt.Println("HelloWorld!")例子解释第1行:在Go中,每个程序都是一个包的