通道在接收时返回相同的值两次

您好,我有以下简单程序:

我有一个函数,它应该从一个通道中获取3个数字并同时打印它们。每次打印都是在 range 语句内的新 goroutine 中完成的。

但是,当我运行此程序时,而不是预期的输出,我得到.你能帮我找出问题出在哪里,为什么我没有从渠道收到已发送到频道的相同值吗?谢谢。printNums(nums chan int)4, 12, 3212, 12, 32


package main


import ("fmt")


func printNums(nums chan int){

    c := make(chan struct{}, 100)

        for num := range(nums){

            go func(){

                fmt.Println(num)

                c <- struct{}{}

            }()

        }

    <-c

    <-c

    <-c

}

func main(){

    nums := make(chan int)


  go func() {

      nums <- 4

      nums <- 12 

      nums <- 32 

      close(nums)

  }()


  printNums(nums)

}


饮歌长啸
浏览 76回答 1
1回答

婷婷同学_

您正在打印的当前值,而不是创建 goroutine 时的值。循环变量在每个转弯处都会被覆盖,并且 goroutine 可能会看到更新的值。numnumfor num := range(nums){&nbsp; &nbsp; go func(x int){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fmt.Println(x)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c <- struct{}{}&nbsp; &nbsp; }(num)&nbsp;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go