#20.? golang go tun -race Обнаружение состояние гонки средствами компилятора - WARNING: DATA RACE

Обнаружение гонки данных

Чтобы обнаружить гонку данных при многопоточном выполнении средствами golang-а, можно запустить программу с флагом -race, например:

go run -race test.go 

где test.go - имя файла с исходным кодом

Например, если мы запустим такой код:

#20.5 golang cap() и len() для Каналов - определяем длину и вместимость

Ранее мы уже говорили про функции cap() и len() для срезов, а для каналов они работают следующим образом:

  • cap() - возвращает размер буфера канала
  • len() - возвращает реальное количество данных в буфере

Как мы помним, каналы могут быть буферизированными и небуферизированными, так вот для канала без буфера и len() и cap() всегда равны нулю (в силу отсутствия там буфера)

Рассмотрим пример для буферизированного канала:

Фотография "Комбат" (Ерёменко) закрыта рекламой - Ликвидация оформления моста памяти Великой Отечественной, Автовокзал Воронеж

Мой товарищ обратил внимание на интересную ситуацию: воронежская администрация провела очень странный перфоманс в ходе которого продемонстрировала явно "нетрадиционное" отношение к памяти о Великой Отечественной Войне, и этот перфоманс проходит в несколько этапов:

#20.4 golang select Горутины и первая выполненная операция с каналом - case, default

Select - выбор первой завершенной горутины

Оператор select позволяет остановить выполнение текущей горутины, до момента пока для одного из вариантов case не удастся совершить "коммуникационную операцию" (channel communication operation) с каналом, а именно:

#20.3 golang Закрытие каналов - close() range()

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

Для закрытия канала используется вызов:

 close(имяКанала)

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

golang "Ссылочные" типы данных - срезы, хэш-таблицы, каналы. Неявная передача указателя в функции

В golang нет ссылок, но есть указатели, тем не менее, поведение рассматриваемых тут типов очень похоже на поведение "ссылочных типов" в других языках.

К "ссылочным" (условно говоря) типам данных в golang-е можно отнести всё те же:

Задача «Сумма двух» - разбор алгоритмической задачи

Задача «Сумма двух» (Two Sum) — это классическая алгоритмическая задача, которая обычно формулируется так:

список чисел, найти порядковые номера (индексы) двух чисел из этого списка, которые в сумме дают заданное число-цель (target)

Например, для чисел:

2, 3, 7, 11, 15}

и целевого числа 9
ответ будет:

2 и 7

Оптимальное решение

Цель задачи - получить сложность O(N), относительно чтения массивы, т.е. линейную сложность

Главная идея:

golang Однонаправленные на уровне создания и инициллизации make() каналы - Зачем они нужны

Каналы, которые действильно созданы как однонаправленные, например:

// Создаём канал только для чтения
ch := make(<-chan int) 

-- на деле могут использовать разве что как моки(заглушки), например:

#20.2 golang Однонаправленные каналы, объявление типа и инициализация - когда используются

Ранее мы начали говорить про каналы в golang и в тех примерах все они были двухнапраправленными - то есть мы могли писать в них и тут же читать, минималистичный пример кода работы с таким каналом будет выглядеть так:

Pages

Subscribe to fkn+antitotal RSS