В статье про BGP, где мы водили за нос Пентагон, были использованы каналы (channels) и горутины (goroutines), одно из основных рабочих средств в языке Go.
Предлагаю начать рассмотреть подробно, что и как работает.
Гороутины (Goroutine[s]) — это фундаментальная особенность Go, которая позволяет параллельно выполнять функции. Goroutine — это, по сути, легкий поток, управляемый средой выполнения Go, который обеспечивает одновременное выполнение функций более эффективным и масштабируемым способом по сравнению с традиционными потоками.
Goroutine можно запускать с помощью ключевого слова go, за которым следует вызов функции. Когда функция вызывается с помощью ключевого слова go, она выполняется параллельно в своей собственной Goroutine, что позволяет ей работать одновременно с другими Goroutine.
Вот простой пример запуска программы с использованием Goroutine:
Каналы Go — это языковая функция в Go, которая предоставляет Goroutines возможность общаться и синхронизироваться друг с другом. Каналы, по сути, являются средством передачи сообщений между Goroutines, позволяя им координировать свои действия и обмениваться данными.
Канал создается с помощью функции make() с ключевым словом chan, за которым следует тип данных, которые будет передавать канал. Например, чтобы создать канал, передающий целые числа, мы можем написать:
ch := make(chan int)
После создания канала мы можем отправлять значения в канал, используя оператор <-, и получать значения из канала, используя тот же оператор в обратном направлении.
Например, чтобы отправить значение 42 в канал, мы можем написать:
ch <- 42
А чтобы получить значение от канала, мы можем написать:
value := <-ch
По умолчанию отправка и получение из канала блокируются до тех пор, пока отправитель и получатель не будут готовы. Это позволяет Goroutines синхронизировать и координировать свои действия друг с другом.
Каналы также можно использовать в сочетании с оператором select для выполнения неблокирующей отправки и получения, а также для одновременного ожидания на нескольких каналах.
Вот пример использования канала для передачи сообщений между двумя Goroutines:
В этом примере мы создаем канал для передачи сообщений между Goroutines и запускаем две Goroutines для отправки и получения сообщений по каналу. Функция sendMessages() отправляет два сообщения в канал, а функция receiveMessages() принимает и распечатывает их. Наконец, мы ждем завершения работы Goroutines, используя вызов time.Sleep() который дает нам некоторое время, для корректного завершения работы Goroutine.
Каналы — это мощная функция Go, которая позволяет Goroutines общаться и координировать свои действия, что делает возможным написание высоко параллельных и масштабируемых программ.