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

/* 
这个实验程序没什么复杂的逻辑,就是在两个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
*/


AIxer
浏览 1983回答 3
3回答

AIxer

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

pardon110

main函数中,注释的那部分显然只开启了一个goroutine,而未注释的则开启了一百个goroutine。
打开App,查看更多内容
随时随地看视频慕课网APP