```func F4() {```
var sum int
t := time.Now().Unix()
ch := make(chan int, 1)
for i := 0; i < 1000; i++ {
ch <- i
go func() {
time.Sleep(1 * time.Second)
j := <-ch
sum += j
}()
}
fmt.Printf("耗时:%v \r\n", time.Now().Unix()-t)
fmt.Println(sum)
}
为什么运行的时候会一直阻塞
<a href="/user/xx706561551" title="@xx706561551">@xx706561551</a>
### Problem
:bowtie: 问题在于通道的使用方式,以及在goroutine中使用time.sleep方法
```go
package main
import (
"fmt"
"time"
)
func F4() {
var sum int
t := time.Now().Unix()
ch := make(chan int, 1)
for i := 0; i < 1000; i++ {
ch <- i
go func() {
time.Sleep(1 * time.Second)
j := <-ch
sum += j
}()
}
fmt.Printf("耗时:%v \r\n", time.Now().Unix()-t)
fmt.Println(sum)
}
func main() {
F4()
}
```
### Analysis
>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 (
"fmt"
"time"
)
func F4() {
var sum int
t := time.Now().Unix()
ch := make(chan int, 1)
for i := 0; i < 1000; i++ {
ch <- i
go func() {
j := <-ch
sum += j
}()
}
time.Sleep(1 * time.Second)
fmt.Printf("耗时:%v \r\n", time.Now().Unix()-t)
fmt.Println("Right Answer: ", 1001*500-1000)
fmt.Println(sum)
}
func main() {
F4()
}
```
### remark
活学活用,希望以上解释能够帮助你。本人也是go小白,若有不正确的地方,也请大家指正!
#1
更多评论