Я пытаюсь запустить приведенный ниже фрагмент кода
package main
import (
"fmt"
"time"
)
func main() {
time.Sleep(time.Millisecond*6000)
fmt.Println("Done")
}
Как и ожидалось, он ждет 6 секунд, печатает «done» и затем завершает работу
Но если я удаляюнапечатать оператор,
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
будет заблокирована при попытке отправить i
на канал, когда там нет получателя, чтобы прочитать егои функция main
немедленно завершается, хотя после нее есть оператор sleep
.Но когда я удаляю оператор
c <- i
, процедура count
получает счет до 3, так как функция main
ожидает этих 5 секунд, как указано.
Что происходитздесь