Как работают массивы в Go и почему с ними бывает непросто при использовании for-range
Классические массивы и срезы в Go на первый взгляд довольно просты. Массивы имеют фиксированный размер, а срезы — динамические. Но скажу честно: Go может казаться простым только на поверхности — под капотом там происходит гораздо больше, чем кажется.
Как обычно, начнём с основ, а затем копнём чуть глубже. Не переживайте, массивы становятся куда интереснее, если взглянуть на них под разными углами.
Что такое массив?
Массивы в Go очень похожи на массивы в других языках программирования. Они имеют фиксированный размер и хранят элементы одного типа в смежных (непрерывных) ячейках памяти.
Это значит, что Go может быстро получать доступ к каждому элементу, так как их адреса вычисляются на основе начального адреса массива и индекса элемента.
https://victoriametrics.com/blog/go-array/
👉 @golang_lib
Классические массивы и срезы в Go на первый взгляд довольно просты. Массивы имеют фиксированный размер, а срезы — динамические. Но скажу честно: Go может казаться простым только на поверхности — под капотом там происходит гораздо больше, чем кажется.
Как обычно, начнём с основ, а затем копнём чуть глубже. Не переживайте, массивы становятся куда интереснее, если взглянуть на них под разными углами.
Что такое массив?
Массивы в Go очень похожи на массивы в других языках программирования. Они имеют фиксированный размер и хранят элементы одного типа в смежных (непрерывных) ячейках памяти.
Это значит, что Go может быстро получать доступ к каждому элементу, так как их адреса вычисляются на основе начального адреса массива и индекса элемента.
https://victoriametrics.com/blog/go-array/
👉 @golang_lib
👍1
FUSE + Go: ковка собственной виртуальной файловой системы на блочном устройстве
В этой статье подробно разбирается создание пользовательской файловой системы с помощью FUSE и языка Go. На реальном примере мы пройдём путь от установки окружения до реализации чтения, записи, метаданных и параллельного доступа. В процессе встретятся живые комментарии, личные наблюдения и советы, которые помогут избежать распространённых подводных камней.
Введение
Давно хотел понять, как сделать “файловую систему в файле” или на блочном устройстве, чтобы потом подключить её к любому Linux-серверу. Оказалось, что комбинация FUSE и Go — отличный вариант для быстрой прототипировки без костылей на C. В этой статье я расскажу о своём опыте, забавных факапах и главных открытиях на пути к рабочей системе.
https://habr.com/ru/articles/933658/
👉 @golang_lib
В этой статье подробно разбирается создание пользовательской файловой системы с помощью FUSE и языка Go. На реальном примере мы пройдём путь от установки окружения до реализации чтения, записи, метаданных и параллельного доступа. В процессе встретятся живые комментарии, личные наблюдения и советы, которые помогут избежать распространённых подводных камней.
Введение
Давно хотел понять, как сделать “файловую систему в файле” или на блочном устройстве, чтобы потом подключить её к любому Linux-серверу. Оказалось, что комбинация FUSE и Go — отличный вариант для быстрой прототипировки без костылей на C. В этой статье я расскажу о своём опыте, забавных факапах и главных открытиях на пути к рабочей системе.
https://habr.com/ru/articles/933658/
👉 @golang_lib
👍2
Go: жарим общие данные. Атомно, быстро и без мьютексов
Как правило, в Go для безопасного доступа к общим данным используются мьютексы. Да, каналы тоже можно приспособить для изменения общих данных, так как они потокобезопасны, но это усложняет и замедляет логику.
Но в этой статье мы поговорим о другом. Современные процессоры имеют поддержку атомарных операций, что позволяет на основе них организовывать работу с общими данными до нескольких раз быстрее, чем с помощью общепринятых вариантов. Так как мьютексы реализованы на основе ОС, каналы сделаны на основе внутреннего кода Go с использованием тех же мьютексов из ОС под капотом, а атомарные операции делает сам процессор аппаратно за существенно меньшее количество тактов.
https://habr.com/ru/companies/ruvds/articles/833264/
👉 @golang_lib
Как правило, в Go для безопасного доступа к общим данным используются мьютексы. Да, каналы тоже можно приспособить для изменения общих данных, так как они потокобезопасны, но это усложняет и замедляет логику.
Но в этой статье мы поговорим о другом. Современные процессоры имеют поддержку атомарных операций, что позволяет на основе них организовывать работу с общими данными до нескольких раз быстрее, чем с помощью общепринятых вариантов. Так как мьютексы реализованы на основе ОС, каналы сделаны на основе внутреннего кода Go с использованием тех же мьютексов из ОС под капотом, а атомарные операции делает сам процессор аппаратно за существенно меньшее количество тактов.
https://habr.com/ru/companies/ruvds/articles/833264/
👉 @golang_lib
👍2🤣1
🚀 Хотите ускорить обработку во Flutter-приложениях, вынеся тяжёлые задачи на C, Rust или Go?
Приходите на открытый вебинар «Запускаем код C, Rust или Go через FFI» 6 августа в 20:00 МСК. На уроке мы покажем:
- Как написать простую функцию на C, Rust и Go и вызвать её из консольного Dart-приложения.
- Как интегрировать эту же функцию во Flutter-приложение.
- Работу со сторонними библиотеками и нюансы FFI-плагина.
- Примеры Makefile для автоматизации сборки под разные архитектуры.
❗️ Вы научитесь компилировать C/Rust/Go-бинарники, вызывать их из Flutter и создавать скрипты сборки. Всё это — надёжный способ оптимизировать обработку изображений, криптографию и другие ресурсоёмкие операции.
Этот урок проходит в преддверии старта курса «Flutter Mobile Developer» от OTUS. 🔥 Все участники получат записи трех прошлых уроков!
👉 Регистрация открыта: https://vk.cc/cOhkoz
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Приходите на открытый вебинар «Запускаем код C, Rust или Go через FFI» 6 августа в 20:00 МСК. На уроке мы покажем:
- Как написать простую функцию на C, Rust и Go и вызвать её из консольного Dart-приложения.
- Как интегрировать эту же функцию во Flutter-приложение.
- Работу со сторонними библиотеками и нюансы FFI-плагина.
- Примеры Makefile для автоматизации сборки под разные архитектуры.
❗️ Вы научитесь компилировать C/Rust/Go-бинарники, вызывать их из Flutter и создавать скрипты сборки. Всё это — надёжный способ оптимизировать обработку изображений, криптографию и другие ресурсоёмкие операции.
Этот урок проходит в преддверии старта курса «Flutter Mobile Developer» от OTUS. 🔥 Все участники получат записи трех прошлых уроков!
👉 Регистрация открыта: https://vk.cc/cOhkoz
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Media is too big
VIEW IN TELEGRAM
Approf
Нативное macOS-приложение для просмотра результатов профилирования pprof, включающее drag/drop, изменение порядка, светлый/темный режим и сохранение сессий.
Возможности
- Поддержка drag-and-drop файла pprof для открытия
- Возможность сравнения pprof-профилей с параметром
- Быстрое добавление, удаление и переупорядочивание файлов
- Тёмный и светлый режимы интерфейса
- Сохранение сессий для последующего использования
Технологии
- SwiftUI и AppKit для UI
- Composable Architecture (TCA) для управления состоянием
- Запуск бинарника pprof в отдельном процессе
https://github.com/moderato-app/approf
👉 @golang_lib
Нативное macOS-приложение для просмотра результатов профилирования pprof, включающее drag/drop, изменение порядка, светлый/темный режим и сохранение сессий.
Возможности
- Поддержка drag-and-drop файла pprof для открытия
- Возможность сравнения pprof-профилей с параметром
-diff_base
- Быстрое добавление, удаление и переупорядочивание файлов
- Тёмный и светлый режимы интерфейса
- Сохранение сессий для последующего использования
Технологии
- SwiftUI и AppKit для UI
- Composable Architecture (TCA) для управления состоянием
- Запуск бинарника pprof в отдельном процессе
https://github.com/moderato-app/approf
👉 @golang_lib
👍1
🔥 Go Maps Explained: Как на самом деле хранятся пары ключ-значение
Go
Ключевые моменты:
Неупорядоченность
Go не гарантирует порядок обхода элементов в
Zero value
Нулевое значение для
Удаление элементов
Удаление производится функцией
Проверка существования ключа
При чтении из карты можно использовать «двухзначную» форму:
где
Память и рост
Go автоматически увеличивает ёмкость карты при необходимости, но уменьшения после удаления большого числа элементов не происходит — память будет удерживаться до освобождения карты целиком.
Конкурентный доступ
Карты в Go не потокобезопасны. Параллельная запись и чтение могут привести к панике. Для защиты используют
👉 Читать
👉 @golang_lib
Go
map
— это встроенный тип данных, который реализует хеш-таблицу для хранения пар ключ–значение. В статье рассматриваются важные детали работы map
в Go, которые часто упускают из виду, и даются практические рекомендации по их использованию.Ключевые моменты:
Неупорядоченность
Go не гарантирует порядок обхода элементов в
map
. Если нужен определённый порядок, нужно использовать срез для сортировки ключей перед обходом.Zero value
Нулевое значение для
map
— nil
. Обращение к неинициализированной карте для чтения безопасно и вернёт нулевое значение для типа, но запись в неё приведёт к панике. Создавать карту можно через make()
или литерал.Удаление элементов
Удаление производится функцией
delete(m, key)
. Если ключа нет — операция безопасна, ошибок не будет.Проверка существования ключа
При чтении из карты можно использовать «двухзначную» форму:
value, ok := m[key]
где
ok
— булево значение, указывающее на наличие ключа.Память и рост
Go автоматически увеличивает ёмкость карты при необходимости, но уменьшения после удаления большого числа элементов не происходит — память будет удерживаться до освобождения карты целиком.
Конкурентный доступ
Карты в Go не потокобезопасны. Параллельная запись и чтение могут привести к панике. Для защиты используют
sync.Mutex
или sync.Map
.👉 Читать
👉 @golang_lib
👍2
Яндекс создаёт продукты и сервисы для миллионов пользователей. Нейросетевой поиск, умные устройства, машинный перевод — задачи, где нет готовых решений.
Поэтому нам нужны сильные бэкенд-разработчики! Если у вас от 5 лет опыта на C++, Python, Java или Go — участвуйте в Мультитреке.
Как это работает
• Подаёте заявку до 18 августа
• Проходите технические секции 23 и 24 августа
• Получаете офер 24 августа
После найма мы предложим поработать в трёх командах несколько недель. Будет время погрузиться в работу, прочувствовать атмосферу и выбрать проект, который вам больше подходит.
Узнайте подробности и оставьте заявку.
Поэтому нам нужны сильные бэкенд-разработчики! Если у вас от 5 лет опыта на C++, Python, Java или Go — участвуйте в Мультитреке.
Как это работает
• Подаёте заявку до 18 августа
• Проходите технические секции 23 и 24 августа
• Получаете офер 24 августа
После найма мы предложим поработать в трёх командах несколько недель. Будет время погрузиться в работу, прочувствовать атмосферу и выбрать проект, который вам больше подходит.
Узнайте подробности и оставьте заявку.
👍1🤡1
Stream: 10-недельная онбординг-программа для бэкенд-инженеров на Go
Добро пожаловать в Stream. Если вы читаете публичную версию этого текста, загляните на нашу страницу с вакансиями. Сейчас мы нанимаем специалистов по Go — от начинающего уровня до ведущих инженеров и директоров.
Stream — это API для создания чатов, живого видео и лент активности. Мы обеспечиваем работу тысяч приложений и охватываем более миллиарда конечных пользователей. Такие приложения, как Strava, Nextdoor, IBM, Adobe и Patreon, полагаются на наши технологии.
По мере расширения команды стало очевидно, что отличная программа онбординга крайне важна. Мне всегда казалось немного странным, что у большинства команд по продажам процесс адаптации выстроен отлично, а у инженерных команд - часто нет.
Эта 10-недельная программа онбординга по Go охватывает несколько тем:
- Основы Go и производительность
- Базы данных, масштабирование и Redis. Распространённые шаблоны масштабируемости
- Лучшие практики тестирования
- Ревью, метрики, обработка ошибок и полный жизненный цикл кода
- Raft и WebRTC
Во время этого онбординга мы работаем в группе и берём реальный проект - лучший способ учиться это сочетать теорию с практикой. Добро пожаловать, начнём!
👉 Читать
👉 @golang_lib
Добро пожаловать в Stream. Если вы читаете публичную версию этого текста, загляните на нашу страницу с вакансиями. Сейчас мы нанимаем специалистов по Go — от начинающего уровня до ведущих инженеров и директоров.
Stream — это API для создания чатов, живого видео и лент активности. Мы обеспечиваем работу тысяч приложений и охватываем более миллиарда конечных пользователей. Такие приложения, как Strava, Nextdoor, IBM, Adobe и Patreon, полагаются на наши технологии.
По мере расширения команды стало очевидно, что отличная программа онбординга крайне важна. Мне всегда казалось немного странным, что у большинства команд по продажам процесс адаптации выстроен отлично, а у инженерных команд - часто нет.
Эта 10-недельная программа онбординга по Go охватывает несколько тем:
- Основы Go и производительность
- Базы данных, масштабирование и Redis. Распространённые шаблоны масштабируемости
- Лучшие практики тестирования
- Ревью, метрики, обработка ошибок и полный жизненный цикл кода
- Raft и WebRTC
Во время этого онбординга мы работаем в группе и берём реальный проект - лучший способ учиться это сочетать теорию с практикой. Добро пожаловать, начнём!
👉 Читать
👉 @golang_lib
❤1👍1
Media is too big
VIEW IN TELEGRAM
Doom на Go
Это минималистичный, независимый от платформ порт легендарного движка DOOM на Go, транслированный из кодовой базы doomgeneric.
Никакого CGo. Никаких зависимостей от платформы.
Оригинальный код на C был конвертирован в Go с помощью modernc.org/ccgo/v4 авторства cznic (репозиторий doomgeneric).
После этого он был вручную переработан: удалено множество операций с указателями, код стал более «в духе Go», но при этом сохранил совместимость с оригинальным DOOM и его архитектурой.
https://github.com/AndreRenaud/gore
👉 @golang_lib
Это минималистичный, независимый от платформ порт легендарного движка DOOM на Go, транслированный из кодовой базы doomgeneric.
Никакого CGo. Никаких зависимостей от платформы.
Оригинальный код на C был конвертирован в Go с помощью modernc.org/ccgo/v4 авторства cznic (репозиторий doomgeneric).
После этого он был вручную переработан: удалено множество операций с указателями, код стал более «в духе Go», но при этом сохранил совместимость с оригинальным DOOM и его архитектурой.
https://github.com/AndreRenaud/gore
👉 @golang_lib
👍1😁1
Как упорядочить код на Go и сделать его масштабируемым?
➡️ На открытом уроке 20 августа в 20:00 МСК мы разберём, что такое пакеты в Go, как правильно организовывать структуру папок и работать с модулями.
❗️Вы получите знания о том, как избежать частых ошибок и эффективно использовать Go в реальных проектах.
🔴 Присоединяйтесь к открытому вебинару «Golang Developer. Basic»: https://vk.cc/cOAU6J
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
➡️ На открытом уроке 20 августа в 20:00 МСК мы разберём, что такое пакеты в Go, как правильно организовывать структуру папок и работать с модулями.
❗️Вы получите знания о том, как избежать частых ошибок и эффективно использовать Go в реальных проектах.
🔴 Присоединяйтесь к открытому вебинару «Golang Developer. Basic»: https://vk.cc/cOAU6J
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
❤1