猿问

为什么在通过通道接收值时看不到输出

在下一个例子中,我不明白为什么收到时没有打印最终值


package main


import "fmt"


func main() {

    start := make(chan int)

    end := make(chan int)


    go func() {

        fmt.Println("Start")

        fmt.Println(<-start)

    }()


    go func() {

        fmt.Println("End")

        fmt.Println(<-end)

    }()


    start <- 1

    end <- 2

}

我知道 sync.WaitGroup 可以解决这个问题。


LEATH
浏览 116回答 3
3回答

狐的传说

因为程序在到达 结束时退出func main,无论是否有其他 goroutine 正在运行。一旦第二个函数从end通道接收到, main 在该通道上的发送就会被解除阻塞并且程序完成,然后接收到的值有机会被传递给Println。

宝慕林4294392

除了必须指定时间的 sleep 之外,您还可以使用 waitgroup 使您的程序等待 goroutine 完成执行。package mainimport "fmt"import "sync"var wg sync.WaitGroupfunc main() {&nbsp; &nbsp; start := make(chan int)&nbsp; &nbsp; end := make(chan int)&nbsp; &nbsp; wg.Add(2)&nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; defer wg.Done()&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("Start")&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(<-start)&nbsp; &nbsp; }()&nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; defer wg.Done()&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("End")&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(<-end)&nbsp; &nbsp; }()&nbsp; &nbsp; start <- 1&nbsp; &nbsp; end <- 2&nbsp; &nbsp; wg.Wait()}

人到中年有点甜

最终值不会被打印出来,因为一旦maingoroutine(该main函数实际上是一个 goroutine)完成(换句话说,被解除阻塞)其他非主 goroutines 就没有机会完成。当函数 main() 返回时,程序退出。此外,goroutines 是独立的执行单元,当它们中的一些一个接一个启动时,你不能依赖 goroutine 何时实际启动。您的代码逻辑必须独立于调用 goroutine 的顺序。解决您的问题的一种方法(在您的情况下是最简单的方法)是将 atime.Sleep放在main()函数的末尾。time.Sleep(1e9)这将保证主 goroutine 不会解除阻塞,并且其他 goroutine 将有更改以执行。package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "time")func main() {&nbsp; &nbsp; start := make(chan int)&nbsp; &nbsp; end := make(chan int)&nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("Start")&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(<-start)&nbsp; &nbsp; }()&nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("End")&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(<-end)&nbsp; &nbsp; }()&nbsp; &nbsp; start <- 1&nbsp; &nbsp; end <- 2&nbsp; &nbsp; time.Sleep(1e9)}您提到的另一个解决方案是使用waitgroup.
随时随地看视频慕课网APP

相关分类

Go
我要回答