Как канальные буферы работают в golang, когда используются без goroutines (в их пределах), против когда они передаются goroutines? - PullRequest
0 голосов
/ 17 декабря 2018

Я абсолютный новичок на Голанге.Я учусь через Tour of Go, а затем воплощаю идеи с моим собственным пониманием.У меня проблемы с горутинами.Я создал небуферизованный канал, а затем отправил строку на этот канал.

func main() {
    p := make(chan string)
    p <- "Hello goroutine"
    fmt.Println(<-p)
}

throws error

фатальная ошибка: все программы находятся в спящем режиме - тупик!

Я понял, канал небуферизован.( Вот в чем причина. Верно? ).

Но когда я рефакторирую p <- "Hello goroutine в goroutine

func main() {
    p := make(chan string)
    go sendHello(p)
    fmt.Println(<-p)
}

func sendHello(p chan string) {
    p <- "Hello goroutine"
}

Это работает без проблем.Я читал, что нам не нужно использовать указатели с картами, срезами и каналами в большинстве случаев для изменения значения. Был channel p передан func sendHello(p chan string) через копию, которая имела отдельный буфер .Я до сих пор не могу разобраться с этим.

1 Ответ

0 голосов
/ 17 декабря 2018

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

В первом примере, когда вы используете небуферизованный канал, канал ожидает получатель , в то время как на момент отправки Hello goroutine сообщение отсутствует,и ждет, пока он не появится (это не относится к буферизованному каналу, поскольку он не требует ожидания), и выполнение никогда не достигает следующей строки (т.е. тупика).

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

...