Перейти канал не заблокирован или заблокирован - PullRequest
0 голосов
/ 23 июня 2018

У меня есть небольшой фрагмент кода, подобный этому

func main() {
    var c chan string
    go func() {
        c <- "let's get started"//write1
        //c <- "let's get started"//write2
        //c <- "let's get started"//write3
        fmt.Println("wrote the stuff....")
    }()
    //time.Sleep(3 * time.Second) //adding this always shows fatal exception
    c = make(chan string)
    fmt.Println(<-c)
}

Я не вижу вывод wrote the stuff.... на консоли, если я раскомментирую строки фрагментов кода //write2 и write3.Я понимаю, что, вероятно, я не вижу этого, потому что канал небуферизован и полностью синхронен, и за пределами канала происходит только одно чтение.Однако при выходе из программы подпрограмма go блокируется, почему нет ошибки типа deadlocked... или чего-то такого, что я вижу в этом случае?

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

Это интересный эксперимент.Я не знаю, возможно ли это, но этот тип ошибки должен быть обнаружен компилятором, должна быть функция, которая проверяет во время компиляции, если что-то пишет в канале nil.

0 голосов
/ 23 июня 2018

Создайте канал до , на который вы пытаетесь записать. Если программа func пытается отправить элементы через c до того, как там на самом деле появится канал, то в конечном итоге используется нулевой канал, который блокируется навсегда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...