如何在 3 秒内打印出这个 Go 代码?

这是 Go 代码 https://www.intervue.io/sandbox-ILSCXZ6RR


func worker() chan int {

   ch := make(chan int)


   go func() {

      time.Sleep(3 * time.Second)

      ch <- 42

   }()


   return ch

}


func main() {

   timeStart := time.Now()


   _, _ = <-worker(), <-worker()


   println(int(time.Since(timeStart).Seconds())) // 3 or 6 ?

}

我怎样才能让它在 3 秒内执行而不是在 6 秒内执行?


www说
浏览 181回答 2
2回答

墨色风雨

这需要 6 秒,因为您正在从返回的通道接收worker(),因此在worker()从第一个接收到值之前,第二个无法启动,这需要 3 秒。您正在使用元组分配。规格:作业:任务分两个阶段进行。首先,左侧的索引表达式和指针间接(包括选择器中的隐式指针间接)的操作数和右侧的表达式都按通常的顺序进行计算。其次,作业是按从左到右的顺序进行的。和规格:评估顺序:...当计算表达式、赋值或返回语句的操作数时,所有函数调用、方法调用和通信操作都按词法从左到右的顺序计算。先启动 2 个 worker,然后再从通道中接收,这样 goroutine 才能真正并发运行:ch1,&nbsp;ch2&nbsp;:=&nbsp;worker(),&nbsp;worker()_,&nbsp;_&nbsp;=&nbsp;<-ch1,&nbsp;<-ch2有了这个,输出将是(在Go Playground上尝试):3

Cats萌萌

您也可以删除通道,因为您没有使用通道的结果,只需使用 sync.WaitGroupfunc worker(n int, wg *sync.WaitGroup) {&nbsp; &nbsp; defer wg.Done()&nbsp; &nbsp; time.Sleep(3 * time.Second)&nbsp; &nbsp; fmt.Println("done")}func main() {&nbsp; &nbsp; timeStart := time.Now()&nbsp; &nbsp; var wg sync.WaitGroup&nbsp; &nbsp; for i := 0; i <= 1; i++ {&nbsp; &nbsp; &nbsp; &nbsp; wg.Add(1)&nbsp; &nbsp; &nbsp; &nbsp; go worker(i, &wg)&nbsp; &nbsp; }&nbsp; &nbsp; wg.Wait()&nbsp; &nbsp; fmt.Println(int(time.Since(timeStart).Seconds())) // 3}这是示例代码: https: //play.golang.org/p/9_Ymx0tcHqS
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go