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

关于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
*/


查看完整描述

2 回答

?
AIxer

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

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

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


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

添加回答

回复

举报

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