新人,学习golang的时候遇到一个问题麻烦大佬讲解一下

xx706561551 · · 891 次点击
<a href="/user/xx706561551" title="@xx706561551">@xx706561551</a> ### Problem :bowtie: 问题在于通道的使用方式,以及在goroutine中使用time.sleep方法 ```go package main import ( &#34;fmt&#34; &#34;time&#34; ) func F4() { var sum int t := time.Now().Unix() ch := make(chan int, 1) for i := 0; i &lt; 1000; i++ { ch &lt;- i go func() { time.Sleep(1 * time.Second) j := &lt;-ch sum += j }() } fmt.Printf(&#34;耗时:%v \r\n&#34;, time.Now().Unix()-t) fmt.Println(sum) } func main() { F4() } ``` ### Analysis &gt;ch := make(chan int, 1) :exclamation: 申请了一个长度为1的通道,并且创建了goroutine。在长度为1通道下,发送消息是阻塞的,意思是前个消息处理完,才能接受下一个消息,然而在第一个接受消息的goroutine执行了time.Sleep,其他goroutine得等着。自然而然,估计这你跑完这个代码1000 seconds。正确的做法是,在mian方法执行goroutine后使用time.sleep, 等待goroutines计算完成。 ### Solution :smile: 正确的代码 ```go package main import ( &#34;fmt&#34; &#34;time&#34; ) func F4() { var sum int t := time.Now().Unix() ch := make(chan int, 1) for i := 0; i &lt; 1000; i++ { ch &lt;- i go func() { j := &lt;-ch sum += j }() } time.Sleep(1 * time.Second) fmt.Printf(&#34;耗时:%v \r\n&#34;, time.Now().Unix()-t) fmt.Println(&#34;Right Answer: &#34;, 1001*500-1000) fmt.Println(sum) } func main() { F4() } ``` ### remark 活学活用,希望以上解释能够帮助你。本人也是go小白,若有不正确的地方,也请大家指正!
#1
更多评论
你把1000次循环改成10次看看,你这个循环太多,没有输出显示,就以为是阻塞的
#3