如何在 3 秒内打印此 Go 代码?

Neh*_*haJ 1 concurrency time channel go goroutine

这是 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 ?
}
Run Code Online (Sandbox Code Playgroud)

如何在 3 秒内执行而不是在 6 秒内执行?

icz*_*cza 17

需要 6 秒,因为您是从 返回的通道接收worker(),因此在worker()从第一个接收到值之前,无法启动第二个,这需要 3 秒。

您正在使用元组分配。规格: 作业:

任务分两个阶段进行。首先,左边的索引表达式指针间接(包括选择器中的隐式指针间接)和右边的表达式的操作数按通常的顺序计算。其次,分配按从左到右的顺序进行。

规范:评估顺序:

...在计算表达式、赋值或return 语句操作数时,所有函数调用、方法调用和通信操作都按词法从左到右的顺序计算

先启动2个worker,然后从channels接收,这样goroutines才能真正并发运行:

ch1, ch2 := worker(), worker()
_, _ = <-ch1, <-ch2
Run Code Online (Sandbox Code Playgroud)

有了这个,输出将是(在Go Playground上尝试):

3
Run Code Online (Sandbox Code Playgroud)