Канал отправлять и получать на func main () - PullRequest
0 голосов
/ 19 декабря 2018

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

func main() {
     message := make(chan string)

     message <- "ping"
     fmt.Println(<-message)
}

Почему приведенное выше приводит к ошибке?Я понимаю, что могу заставить его работать, введя стандартную процедуру, чтобы подготовить отправителя и получателя.Однако, если это так, почему работает следующее:

func main() {
    message := make(chan string,1)

    message <- "ping"
    fmt.Println(<-message)

}

********* Спасибо Джо МакМэхон за ваш ответ ****************** Документирование ниже для моей справки *********Я предположил, что буфер 1 (в отличие от 2) также будет блокировать основную процедуру, пока не найдет соответствующий приемник.Кажется, что буфер 1 работает как 0 & 1 и не блокирует код для 0-й записи / чтения.Чтобы продемонстрировать блок с использованием буферов,

func main() {
    message := make(chan string, 1)

    message <- "ping1"
    message <- "ping2"
    fmt.Println(<-message) //Unreachable code.
}

1 Ответ

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

Добавление буфера ', 1' канала.Это означает, что одна запись в канал является неблокирующей, и основная программа сохраняет управление.Если канал не буферизован, то программа записи блокируется до тех пор, пока другая программа не получит управление и не прочитает данные из канала.

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

Если вы используете маршрут и небуферизованный канал:

  • Запуск программы, читает из канала и блокирует, ожидая, что что-то будет записано в канал.
  • Основная программа пишет в канал и блокирует, ожидая, что кто-то прочитает только что написанную строку.
  • Диспетчер Go ищет подпрограмму, подходящую для выполнения, находит горутин со строкой, готовой для чтения из канала.Он возвращает управление goroutine, который получает строку и продолжает.
  • Когда эта программа завершает работу или делает что-то еще, что приводит к потере контроля, диспетчер ищет другую программу, готовую к запуску, и видит, что основная программа успешно завершила запись в канал (строка была прочитанаgoroutine).Диспетчер контролирует основную программу.
  • Основная программа завершается и завершается.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...