如何解决如何在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秒内执行?
解决方法
这需要6秒钟,因为您是从worker()
返回的频道接收的,所以第二个worker()
不能启动,直到从第一个收到一个值,这需要3秒钟。
您正在使用元组分配。 Spec: Assignments:
任务分两个阶段进行。首先,左侧的index expressions和pointer indirections的操作数(包括selectors中的隐式指针间接寻址)和右侧的表达式均为evaluated in the usual order 。其次,分配是从左到右执行的。
...在评估表达式,赋值或operands的return statement时,所有函数调用,方法调用和通信操作均按从左到右的词汇顺序进行评估。
首先启动2个工作程序,然后然后从渠道接收消息,因此goroutine可以真正同时运行:
ch1,ch2 := worker(),worker()
_,_ = <-ch1,<-ch2
这样,输出将是(在Go Playground上尝试):
3
,
您还可以删除频道,因为您没有使用频道的结果,只需使用sync.WaitGroup
func worker(n int,wg *sync.WaitGroup) {
defer wg.Done()
time.Sleep(3 * time.Second)
fmt.Println("done")
}
func main() {
timeStart := time.Now()
var wg sync.WaitGroup
for i := 0; i <= 1; i++ {
wg.Add(1)
go worker(i,&wg)
}
wg.Wait()
fmt.Println(int(time.Since(timeStart).Seconds())) // 3
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。