Запись дважды на небуферизованный канал приводит к различным результатам в зависимости от выбранного использования. Почему? - PullRequest
0 голосов
/ 03 ноября 2019

Рассмотрим два примера:

Первый:

package main

import "fmt"

func main() {
        c := make(chan int)
        go func(){
                c <- 1
        }()
        go func(){
                c <- 2
        }()
        select {
        case <-c:
                fmt.Println("<-c:", <-c)
                fmt.Println("<-c:", <-c)
        }
}

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

Но я не понимаю, что происходит со второй программой. Блокирует ли он, потому что канал небуферизован, и он не может содержать два значения design .

С этим фрагментом я захожу в тупик. Я нашел похожий вопрос здесь .

И если да, то как этот код работает тогда?

package main

import "fmt"

func main() {
        c := make(chan int)
        go func(){
                c <- 1
        }()
        go func(){
                c <- 2
        }()
        select {
        case forget := <-c:
                fmt.Println("forget:", forget)
                fmt.Println("<-c:", <-c)
        }
}

1 Ответ

0 голосов
/ 03 ноября 2019

Хорошо, похоже, что использование case <-c фактически читает из канала, а не просто проверяет его на наличие значения, как я думал.

...