猿问

Go 例程没有接收到通过通道发送的所有数据——玩具示例程序

我只是在玩弄Go,可以这么说。我遇到了一个问题,一个旨在接收3整数的 go 例程似乎只接收一个。


type simpleFunction func() int


func run(fChan chan simpleFunction, result chan int) {

  for{

    select {

    case fn := <-fChan:

      fmt.Printf("sending: %d down result chan\n", fn())

      result <- fn()

    case <-time.After(time.Second * 2):

      close(fChan)

    }

  }

}


func recieve(result chan int){

  for {

    select {

    case x := <-result:

      fmt.Printf("recieved: %d from result chan\n", x)

    case <-time.After(time.Second * 2):

      close(result)

    }

  }

}

因此,正如您所看到的,run例程接收函数,评估它们,然后将结果发送到result通道中。


这是我的main/ test:


func main() {

  fns := []simpleFunction{

    func() int {return 1},

    func() int {return 2},

    func() int {return 3},

  }


  fChan := make(chan simpleFunction)

  result := make(chan int)


  go run(fChan, result)

  go recieve(result)

  for _, fn := range fns {

    fmt.Printf("sending a function that returns: %d down function chan\n", fn())

    fChan <- fn

  }

这是我的输出:


sending a function that returns: 1 down function chan

sending: 1 down result chan

recieved: 1 from result chan

sending a function that returns: 2 down function chan

sending a function that returns: 3 down function chan

sending: 2 down result chan

sending: 3 down result chan

所以,正如你所看到的,第一个功能似乎一切顺利,但之后就没有那么热了。任何提示或建议?


临摹微笑
浏览 122回答 1
1回答

SMILET

这段代码有几个问题:当 main 返回时程序终止。它不会等待run和receivegoroutine 完成。关闭频道是一场竞赛。不能保证发件人在超时之前将发送最多。如果 main 没有退出,那么for { select { } }循环将永远旋转打印零值。在关闭的通道上接收返回零值。
随时随地看视频慕课网APP

相关分类

Go
我要回答