我正在尝试在下面的代码中运行它
package main
import (
"fmt"
"time"
)
func main() {
time.Sleep(time.Millisecond*6000)
fmt.Println("Done")
}
正如预期的那样,它等待 6 秒,打印“完成”,然后退出
但是如果我删除打印语句,
package main
import (
"time"
)
func main() {
time.Sleep(time.Millisecond*6000)
}
它不会等待并立即退出。为什么?
因此,请看下面的代码
package main
import (
"fmt"
"time"
)
func main() {
c := make(chan int)
go count(6, c)
time.Sleep(time.Millisecond*5000)
}
func count(num int, c chan int) {
for i := 1; i <= num; i++ {
fmt.Println(i)
c <- i
time.Sleep(time.Millisecond*2000)
}
close(c)
}
在这里,当没有接收者可以读取时, count
goroutine 将被阻止尝试发送到通道,并且即使在它之后有一条语句,该函数也会立即退出。但是当我删除声明时i
main
sleep
c <- i
count
goroutine 会一直计数到 3,因为函数main
确实会等待 5 秒,如前所述。
这里发生了什么?