Значение канала хранения Goroutine не имеет тупиков - PullRequest
0 голосов
/ 15 марта 2019

Этот код выполняется и заканчивается без ошибки взаимоблокировки. Зачем?

func main() {
    ch := make(chan int)
    go func() {
        ch<-1
        ch<-2
    }()

    time.Sleep(time.Second)
}

1 Ответ

2 голосов
/ 15 марта 2019

Небуферизованному каналу нужны две конечные точки для работы, поэтому давайте начнем с правильного примера:

package main

func main() {
    go fun2()
    <-ch
    <-ch
}
func fun2() {
    ch <- 1
    ch <- 2
}

var ch = make(chan int)

Здесь fun2() отправляет два значения, а main() получает два значения.


Ваш пример кода имеет только одну конечную точку, поэтому канал построен неправильно, поэтому это тупик , но процедуры main обычно завершаются, поэтому вы не видите ошибку.Здесь нет второй конечной точки, поэтому это тупик:

package main

func main() {
    var ch = make(chan int)
    ch <- 1
}

Выход:

fatal error: all goroutines are asleep - deadlock!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...