Найти тему
081 Мьютексы
Мьютексы, сокращение от взаимного исключения, используются в Go для синхронизации доступа к общим ресурсам, таким как память или файлы. Они позволяют только одной Goroutine одновременно получить доступ к критической секции кода, предотвращая одновременный доступ и изменение общих ресурсов несколькими Goroutine. В Go мьютексы реализуются с помощью пакета sync, который предоставляет тип Mutex для взаимного исключения. Чтобы использовать мьютекс, мы сначала создаем экземпляр Mutex, а затем используем...
1 год назад
080 Потоковая передача данных
Потоковая передача данных — это процесс передачи непрерывного потока данных от одной Goroutine к другой с помощью каналов. В Go каналы могут быть использованы для реализации потоковой передачи данных, позволяя Goroutines передавать данные туда и обратно по мере их поступления. Вот пример использования каналов для потоковой передачи данных: В этом примере мы определяем две Goroutines generateData() и processData(). Горутина generateData() посылает целые числа от 1 до 10 по каналу ch, используя ch <- i, а затем засыпает на одну секунду, используя time...
1 год назад
079 Синхронизация
В Go синхронизация - это процесс координации нескольких Goroutine для обеспечения их правильного выполнения и избежания условий гонки или тупиков. Синхронизация важна при работе с параллельными программами, поскольку она гарантирует, что каждая Goroutine ведет себя правильно и что программа в целом функционирует так, как задумано. Одним из способов достижения синхронизации в Go является использование каналов. Каналы можно использовать для передачи данных между Goroutine и обеспечения их согласованного выполнения...
1 год назад
078 Закрытие канала
В Go важно не забывать закрывать канал после того, как вы закончили отправлять по нему значения. Закрытие канала сигнализирует приемнику, что по этому каналу больше не будут передаваться значения, что позволяет приемнику, например выйти из цикла for, когда больше нет значений для приема. Вот пример закрытия канала после передачи значения: В этом примере мы создаем небуферизованный канал ch типа int с помощью make(chan int). Затем мы запускаем Goroutine, которая посылает значение 42 по каналу с помощью ch <- 42...
1 год назад
077 Канал как возвращаемое значение
В Go каналы могут использоваться в качестве возвращаемых значений функций, что может быть полезно в случаях, когда вам нужно передать данные между Goroutine, но вы не хотите блокировать вызывающую Goroutine, пока данные не будут готовы. Вот пример функции, которая возвращает канал: В этом примере мы определяем функцию generateNumbers(), которая возвращает канал типа <-chan int, предназначенный только для приема. Функция создает канал ch и запускает Goroutine, которая отправляет целые числа от 1 до 10 по каналу с помощью цикла for...
1 год назад
076 Однонаправленные каналы
В Go каналы можно ограничить, чтобы они позволяли только отправлять или получать операции, используя однонаправленные типы каналов. Однонаправленные каналы могут обеспечить повышенную безопасность и выразительность в определенных ситуациях, гарантируя, что каналы используются только соответствующим образом. Тип однонаправленного канала можно создать, указав направление канала с помощью оператора <-. Например, канал, разрешающий только операции отправки, может быть определен как chan<- int, а канал, разрешающий только операции приема, может быть определен как <-chan int...
1 год назад
075 Буферизованные каналы
Буферизованные каналы — это тип каналов в Go, которые имеют емкость больше нуля. Это означает, что они могут хранить несколько значений в буфере до тех пор, пока они не будут прочитаны Goroutine. Когда значение отправляется по буферизованному каналу, оно будет добавлено в буфер, если в нем есть свободное место. Если буфер заполнен, отправляющая Goroutine будет блокироваться до тех пор, пока в буфере не освободится место. Аналогично, когда значение принимается из буферизованного канала, оно будет удалено из буфера...
1 год назад
074 Небуферизованные каналы
Небуферизованные каналы - это тип каналов в Go, емкость которых равна нулю. Это означает, что небуферизованные каналы могут одновременно хранить только одно значение и что отправка или получение значения по небуферизованному каналу будет блокироваться до тех пор, пока другая Goroutine не будет готова отправить или получить это значение. Когда значение отправляется по небуферизованному каналу, отправляющая Goroutine будет блокироваться до тех пор, пока другая Goroutine не будет готова принять значение...
1 год назад
073 Горутины и каналы
В статье про BGP, где мы водили за нос Пентагон, были использованы каналы (channels) и горутины (goroutines), одно из основных рабочих средств в языке Go. Предлагаю начать рассмотреть подробно, что и как работает. Гороутины (Goroutine[s]) — это фундаментальная особенность Go, которая позволяет параллельно выполнять функции. Goroutine — это, по сути, легкий поток, управляемый средой выполнения Go, который обеспечивает одновременное выполнение функций более эффективным и масштабируемым способом по сравнению с традиционными потоками...
1 год назад
072 Пакет time
В предыдущей публикации мы использовали следующую конструкцию из пакета time: time.Sleep(1 * time.Second) — это оператор, который приостанавливает выполнение текущей goroutine (горутины (облегченного потока выполнения)) на 1 секунду. Time.Second — это предопределенная константа в пакете time, которая представляет собой 1 секунду. Умножение ее на 1 создает значение time.Duration, равное 1 секунде. Полученное значение time.Duration затем передается в качестве аргумента в функцию time.Sleep, заставляя текущую горутину спать в течение указанного времени...
1 год назад
071 Протокол BGP или как работает Интернет
Протокол пограничного шлюза (BGP) — это протокол, используемый для междоменной маршрутизации в Интернете. BGP является важным компонентом инфраструктуры Интернета, поскольку он позволяет различным автономным системам (ASes) общаться и обмениваться информацией о маршрутизации друг с другом. Автономная система — это совокупность взаимосвязанных сетей, управляемых одной организацией или подразделением. Одной из ключевых особенностей BGP является использование номеров автономных систем (ASN) для идентификации каждой автономной системы в Интернете...
1 год назад
070 Алгоритм быстрой сортировки
В данной реализации алгоритма быстрой сортировки мы начинаем с проверки того, что длина массива меньше или равна 1. Если это так, мы просто возвращаем массив, поскольку он уже отсортирован. Далее мы выбираем поворотный элемент, взяв средний элемент массива. Затем мы создаем два среза для хранения элементов, меньших, чем поворотный, и элементов, больших, чем поворотный. Перебираем массив, пропуская поворотный элемент. Если элемент меньше поворотного, мы добавляем его в левый фрагмент...
159 читали · 1 год назад