为了账号安全,请及时绑定邮箱和手机立即绑定

关于go func 中 的分发方式的疑惑: 为什么i会被多次分发?

关于go func 中 的分发方式的疑惑: 为什么i会被多次分发?

AIxer 2019-06-05 20:14:05
/*  这个实验程序没什么复杂的逻辑,就是在两个go routine间建个通道传数 输出确实会乱序,不过好多重复呀 这个在for循环里的gofunc有意义么? 循环里面go? go 里面 循环???? emmmmmmm 希望大家能指点一下~ */ func main() {    out := printer()         for i := 0; i < 100; i++ {       go func() { out <- i }()    // 为什么这里的i会被多次分发?    }    // go func() {    //  for i := 0; i < 10; i++ {    //    out <- i    // }    //}()  // 这样子是顺序了,也不知道是不是并发的    time.Sleep(time.Minute) } func printer() chan int {    out := make(chan int)    go func() {       for {          r := <-out          fmt.Println(r)       }    }()    return out } /* 以下是部分输出 11 27 27 27 27 27 */
查看完整描述

3 回答

?
AIxer

TA贡献22条经验 获得超13个赞

问题已经在结果上解决了,只要把 i 以参数形式传给go func就行了

查看完整回答
反对 回复 2019-06-06
?
pardon110

TA贡献1038条经验 获得超227个赞

main函数中,注释的那部分显然只开启了一个goroutine,而未注释的则开启了一百个goroutine。


查看完整回答
反对 回复 2019-06-05
  • AIxer
    AIxer
    是的呀,各个go routine是并行的对吧,但各个go func 里只有一条语句,就是往那个我定义的唯一的channel里送数据,结果虽然只有一条语句但每个go func 往channe里不只送了一次i ???
  • 3 回答
  • 1 关注
  • 1983 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信