Все потоки
Поиск
Написать публикацию
Обновить
98.98

Go *

Компилируемый, многопоточный язык программирования

Сначала показывать
Порог рейтинга

Вышел NATS.go 1.46 - Go-клиент для системы обмена сообщениями NATS.

Ключевые изменения:

  • Появились параметры конфигурации счетчиков стримов

  • Новые поля в ClusterInfo

  • Контекст и таймаут опции для Messages.Next() а также появился в Fetch поддержка контекста

  • Поддержка пользовательских префиксов имен для консумеров

  • Добавлена ​​поддержка метаданных для KeyValue бакета.

  • Ошибка добавления максимального лимита потребителей (код=10026).

  • Возвращает более конкретную информацию об ошибке при проблемах пересоздания потребителя

GitHub: https://github.com/nats-io/nats.go

ChangeLog: https://github.com/nats-io/nats.go/releases/tag/v1.46.0

Теги:
+1
Комментарии0

Хеш-таблица с транзакциями на Go

Привет, продолжим удивительное. Смех смехом, но на Go стали доступны:

  1. Хеш-таблица с транзакциями.

  2. Структуры данных второго порядка.

И в отличие от C++, они еще не создают проблемы для Garbage Collector. Вы угадайте почему, а я немного процитирую:

------------------8<------------------

Все выглядит примерно так:

func NewMemDb() MemDb { /* ... */ }

type MemDb interface {
    Close() error
    StartTrn() Transaction
}

type Transaction interface {
    Close() error

    Get(key Ptrsz) (Ptrsz, bool)
    All(getKeys bool, getVals bool) (keys []Ptrsz, vals []Ptrsz)

    Set(key Ptrsz, val Ptrsz)
    Del(key Ptrsz)

    DependVal(key Ptrsz, val Ptrsz)
    DependDel(key Ptrsz)

    Commit() error
    Rollback() error
}

А именно:

  • Объект MemDb создается с помощью функции NewMemDb().

  • У MemDb есть функция Close() -- мы ОБЯЗАНЫ ее вызвать!!!

  • Объект Transaction создается с помощью функции StartTrn().

  • У Transaction тоже есть функция Close(). Да, мы ОБЯЗАНЫ!

  • Transaction работает с данными через lib.Ptrsz. Точно также, как и mdb.BlobMap.

  • Чтение данных выполняется посредством функций Get() и All(). Возвращаемые ими Ptrsz указывают на внутренние структуры MemDb. Они остаются валидными пока не завершена транзакция и не было вызовов Set() и Del(), инвалидирующих указатели.

  • Изменение данных выполняется посредством функций Set() и Del()MemDb копирует себе байты, на которые указывают key и val.

  • Функции DependVal() и DependDel() устанавливают зависимости. Их проверяет Commit().

  • Функции Commit() и Rollback() завершают транзакцию. Завершают, но не закрывают! Мы ОБЯЗАНЫ вызвать Close()!!

  • Просто Close() означает Rollback().

------------------8<------------------

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

Теги:
-2
Комментарии0

Вышла новая версия пакета easyjson - 0.9.1, содержит исправления выявленных ошибок.

Пакет easyjson предоставляет быстрый и простой способ маршалинга/демаршалинга структур Go в/из JSON без использования рефлексии. Фундамент - кодогенерация.

В тестах производительности easyjson превосходит стандартный пакет encoding/json в 4-5 раз, а другие пакеты работы с JSON — в 2-3 раза.

Easyjson стремится сделать сгенерированный код Go достаточно простым, чтобы его можно было легко оптимизировать или исправить. Вторая цель — предоставить пользователям возможность настраивать сгенерированный код, предоставляя функции, недоступные в стандартном пакете encoding/json, такие как генерация имён в формате «snake_case» или включение поведения omitempty по умолчанию.

GitHub: https://github.com/mailru/easyjson

Подробности исправления: https://github.com/mailru/easyjson/pull/423

Теги:
0
Комментарии0

Привет, Хабр!

Всего две недели назад вышла версия Explyt 4.1 с поддержкой Python, MCP серверов, новыми Rules и Workflows, а уже сегодня мы рады поделиться новым релизом Explyt 4.2 с поддержкой Go. Теперь все фичи AI агента доступны в GoLand.

Важное обновление

Начиная с версии Explyt 4.2, мы вводим процедуру регистрации новых пользователей. Этот процесс займёт 30 секунд и позволит: 

  • повысить стабильность и доступность инфраструктуры из любой точки мира 

  • корректно соблюдать правовые требования 

Если вы уже пользуетесь плагином, потребуется пройти авторизацию в своём аккаунте прямо из интерфейса плагина.

Запуская бесплатный 30-дневный триал Personal версии, вы сразу получаете 4000 кредитов, которые можно использовать для запросов к LLM.

Возможность пользоваться своими моделями без регистрации в версии Community по-прежнему остается.

Скачать Explyt 4.2 можно с нашего сайта. Для багрепортов и фичриквестов - GitHub Issues и чат с командой плагина. Будем рады вашей обратной связи и философским вопросам 🖖

Теги:
+3
Комментарии2

Go + Windows = deadlock. Свет в конце тоннеля.

В прошлой статье я рассказывал о редком, но весьма опасном баге: поток под Windows зависал в вызове CancelIoEx, хотя документация Microsoft утверждает обратное. Суть проблемы — в пересечении синхронного и асинхронного ввода-вывода, где ядро Windows блокирует доставку APC, и поток остаётся навсегда «висящим».

История получила развитие не сама по себе: мы целенаправленно поднимали эту тему через support-кейс в Microsoft. В результате удалось подключить и Escalation Team, и разработчиков Go, ответственных за Windows-порт.

Финальный вывод: стандартная библиотека Go действительно использует неправильный API для отмены синхронных операций. Вместо CancelSynchronousIo, рекомендованного самой Microsoft, в коде до сих пор вызывается CancelIoEx.

👀 Сам проблемный вызов:
https://github.com/golang/go/blob/77f911e31c243a8302c086d64dbef340b0c999b8/src/internal/poll/fd_windows.go#L461

Хорошая новость: у команды уже есть рабочий proof-of-concept фикса:
https://go-review.googlesource.com/c/go/+/691395

Менее радостная часть: из-за сложности изменений и их влияния на рантайм правка запланирована только в Go 1.26 (февраль 2026). Бэкпорт в предыдущие версии практически исключён.

Что это значит для разработчиков

  • Если ваш сервис на Go под Windows внезапно «зависает» в CancelIoEx — это следствие бага в стандартной библиотеке, а не ваша ошибка.

  • До релиза Go 1.26 остаются обходные варианты:

    • не вызывать CancelIoEx для синхронных дескрипторов,

    • использовать CancelSynchronousIo, если есть возможность управлять потоками,

    • минимизировать использование пайпов в критичных местах.

Итог

Редкий flaky-тест Go (TestPipeIOCloseRace) оказался симптомом реальной и серьёзной проблемы. Благодаря эскалации через Microsoft Support и совместному разбору мы получили подтверждение, понятное объяснение и официальный фикс в планах.

⚡️ Если ваш Go-код на Windows зависает в CancelIoEx, теперь вы знаете: проблема признана и исправление уже в пути.

Теги:
+10
Комментарии0

EasyP – тулбокс для работы с ProtoBuf⁠⁠

easyp – пакетный менеджер, билд-система и линтер для .proto файлов.
Хоть easyp и написан на #go 😱, одна из его фишек в том – что вы можете использовать любые плагины для генерации финального кода: он может быть хоть на #python, хоть на #rust.

Если много используете ProtoBuf – обязательно для ознакомления!

Пример конфигурации:

# Секция для правил линтера:
lint:
  use:
    - DEFAULT

# Секция с зависимостями:
deps:
  - github.com/googleapis/googleapis
  - github.com/grpc-ecosystem/grpc-gateway@v2.20.0

# Секция для правил сборки и генерации итоговых файлов:
generate:
  plugins:
    - name: go
      out: .
      opts:
        paths: source_relative
    - name: go-grpc
      out: .
      opts:
        paths: source_relative
        require_unimplemented_servers: false

Прощайте огромные Makefile с кучей скриптов для сборки.

Проект: https://github.com/easyp-tech/easyp

Документация: https://easyp.tech

Теги:
+6
Комментарии6

Подборка обучающих материалов по языкам программирования от Selectel: Go, Python и JavaScript

Привет, Хабр! Несу вам небольшую подборку материалов, которые помогут новичкам лучше разобраться в трех популярных ЯП. Все статьи доступны бесплатно, регистрироваться нигде не нужно, вообще никаких обязательств с вашей стороны. Итак, поехали.

Go

Эти семь статей составляют практический гайд по работе с Go. Вы научитесь писать простые сервисы вроде сокращателя ссылок и использовать этот язык в некоторых рабочих задачах, а еще получите большую подборку материалов для погружения в тему (да, у нас тут подборка в подборке, так уж вышло). На прочтение всех материалов уйдет примерно два часа.

Python

Если самые базовые вещи в Python вы уже освоили, то эта подборка для вас. Вы узнаете, как настраивать инструменты, работать с базами данных, создавать программы с интерфейсом и использовать Python для парсинга. А еще здесь есть несколько интересных задач, чтобы можно было закрепить знания. Всего в подборке девять материалов, примерно на четыре с небольшим часа чтения.

JavaScript

Эту подборку мы с коллегами собрали для тех, кто только делает свой первый шаг в мир JavaScript. В пяти статьях рассказываем, как работать с переменными, типами данных и функциями, а также как строить логику с условными операторами. Практические примеры помогут освоить создание элементов и взаимодействие с ними через JavaScript, а задача в конце — закрепить знания и испытать навыки.

Теги:
+9
Комментарии0

Мы на Let's Go Conf: расскажем, как приручали старый Gateway, и слетаем в космос

В этом году компания МойОфис стала партнёром конференции для Go-разработчиков Let’s GoConf, которая пройдёт 12 сентября в Москве в лофте «Пространство Весна».

В одном из треков выступит Герман Кравец, техлид модуля Календарь почтового сервиса Mailion. В своём докладе он расскажет о том, как команда Mailion работала с «наследием». Представьте: старый Gateway, застрявший на Go 1.19, сложный в поддержке, с самописными генераторами и C++-зависимостями, а конфигурации напоминают древние свитки... Герман поделится тем, как команда справилась с такими вызовами и как изменилась архитектура продукта.

Но конференция — это не только доклады. Для участников мы приготовили по-настоящему космическую игру: нужно будет спасти колонизаторов далёкой планеты, решать задачи по Go и получать призы. Уверены, это станет отличным дополнением к технической программе и подарит всем гостям отличный настрой.

Ждём вас на Let’s Go Conf!

Теги:
+18
Комментарии0

Лутаем Open Source #24. Они наконец-то починили MongoDB! Перенеся его на PostgreSQL...

DocumentDB – БД от Microsoft, которая состоит из 3-х частей:

  1. PG расширение, добавляющее BSON формат (написанный, на С)

  2. CRUD API поверх него (С)

  3. Сервис трансляции Mongo Query в SQL (Rust)

Для кого это?

И вроде как: "PG – классная база, а MongoDB Query + BSON популярные технологии" – и можно было бы поразмышлять чем это круто, но сначала важно ответить на один туманный вопрос: "кому такая БД может быть нужна?"

Классический PG

Сначала рассмотрим кейс, когда мы накладываем DocumentDB на обычный PostgreSQL.

Те, кто используют MongoDB если попробуют переехать на такой сэтап столкутся с тем, что:

  • Там нет шардинга (и насколько бы он не был сложно реализован в MongoDB, он есть и им активно пользуются)

  • Придется использовать двойной тулинг: Compas, чтобы наблюдать за корректностью данных с MongoDB Query, и SQL если надо посмотреть что там внутри

  • MongoDB поддерживает Uncommitted Read и Write Majority, что странно накладывается на PG: если разраб достаточно продвинутый и намеренно использовал Uncommitted, то с PG он потеряет скорость и Availability из-за PG Committed, а если он использовал Write Majority, то PG не совсем дает такую гарантию (обвал диска при WAL репликации – менее надежен, чем Write Majority)

  • А самое главное: когда ты работаешь с MongoDB ты можешь открывать 1000 коннекшенов и он вполне себе все это сожрет, потому что (1) коннекшен это тред, (2) при запросах нет никакой проверки реляционной целостности, да и в целом проверка сильно проще, чем в PG, а значит придется потанцевать с пуллерами и даже менять где-то запросы, чтобы не упасть по скорости

То есть, у mongo-юзеров это заберет все особенные фичи MongoDB и при этом не даст фишки PostgreSQL.

Distributed PG-like

А что, если мы положим DocumentDB на что-нибудь из серии CockroachDB, YugabyteDB, AWS Aurora, Citus или Neon?

Все 3 проблемы решаются:

  • Шардинг из коробки

  • Достаточно высокая скорость записи и чтения

  • Отсутствие проблем с коннектами

В такой ситуации DocumentDB начинает играть новыми красками.

Но если в Neon и Citus (и может YugabyteDB) еще есть шанс добавить текущий DocumentDB BSON плагин, то в для других представителей придется писать его с нуля (причем под каждый свой, потому что они построены каждый на своем KV хранилище).

Переезд в Linux Foundation

А еще они сейчас в процессе переезда из Microsoft в Linux Foundation, из плюсов они будут полностью под MIT лицензией и пейвола, за который будут прятать полезные фичи, из минусов, Microsoft могут и забросить, а никто другой не подхватить.

Итоги

Неоднозначная технология, пока имеет смысл в каких-то тонких кейсах, но в общем и целом, не вижу пока где тут middle-ground, может, вы что-то подскажете?

P.S.

А еще приглашаю вас к обсуждению в свой паблик в телеграмме 🦾 IT-Качалка Давида Шекунца 💪

Теги:
+4
Комментарии2

2ГИС зовёт на хакатон: https://hackathon.2gis.ru

4–5 октября, офлайн, Москва. Два дня, чтобы общаться, фигачить, вдохновляться и повлиять на городские сервисы!

Три трека: городские данные с ЦОДД, инклюзия с фондами «Антон тут рядом», «Продвижение», «ЛизаАлерт» и носимые устройства — часы, браслеты, AR и другие гаджеты. Будут онлайн-встречи, чтобы больше узнать про реальные задачи.

Призовой фонд: 1 000 000 рублей и шанс, что проект попадёт прямо в 2ГИС🔥

Регистрироваться можно с командой от 3 до 6 человек или самостоятельно — поможем найти команду в чате!

Теги:
0
Комментарии0

Вышел Gonzo 0.1.6 - терминальный UI для анализа журналов в реальном времени. Написал на Go, вдохновлён k9s. Позволяет анализировать потоки журналов с помощью красивых диаграмм, аналитики и расширенной фильтрации — всё прямо в терминале.

ChangeLog: https://github.com/control-theory/gonzo/releases/tag/v0.1.6

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии0

Мое решение для Нерешаемой Проблемы

Все дети знают, что много мусора создает большие проблемы для Garbage Collector. Ну а взрослые видели и НЕРЕШАЕМЫЕ! Причем, мусора было немного:

We kept digging and learned the spikes were huge not because of a massive amount of ready-to-free memory, but because the garbage collector needed to scan the entire LRU cache in order to determine if the memory was truly free from references.

Что в этом случае делают взрослые? Правильно! Взрослые в ужасе убегают...

У меня есть решение для тех, кто устал убегать: mdb.BlobMap. Это быстрая хеш-таблица, не создающая проблем сборщику мусора:

ОК, что значит "не создающая проблем"? В данном случае это значит, что весь mdb.BlobMap -- это просто массив uint64...

Так НЕ БЫВАЕТ?!

Бывает, чо https://ders.by/go/blobmap/blobmap.html

Теги:
Всего голосов 5: ↑0 и ↓5-5
Комментарии0

В прошлую субботу я подал заявку на участие в митапе GoSharp Weekend, который проводит компания Ozon Tech. Все заявки на этот митап проходят модерацию, т.к. к участию допускаются только C#- и Go-разработчики уровня middle+.

Вчера я получил письмо с отказом:

Сначала я подумал, что просто закончились свободные места. Но сегодня я, как постоянный участник мероприятий Ozon Tech, получил письмо с рекламой данного мероприятия. Получается, что свободные места все еще есть, а моя заявку отклонили, потому что она не прошла модерацию. Вполне возможно, что из-за всей этой охоты на волков организаторы не поняли, что означает фраза «опенсорс-мейнтейнер», и приняли меня за накрутчика опыта.

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии1

Ближайшие события

Вышел NATS.go 1.45 - Go-клиент для системы обмена сообщениями NATS.

Ключевые изменения:

  • В Core NATS добавлена обработка превышения максимального количества активных подключений к учетной записи

  • В JetStream добавлена опция WithExpectLastSequenceForSubject для логики публикации

  • Добавили тесты на проверку обновлений KV TTL watcher

  • Исправлено несколько ошибок

GitHub: https://github.com/nats-io/nats.go

ChangeLog: https://github.com/nats-io/nats.go/releases/tag/v1.45.0

Теги:
Рейтинг0
Комментарии0

Вышел Statsviz 0.7.0- визуализатор работы Golang программы в реальном времени.

В число показателей входят данные о куче, переменных, горутинах, паузах работы сборщика мусора, планировщика. Данные выводятся в браузере.

GitHub: https://github.com/arl/statsviz

ChangeLog: https://github.com/arl/statsviz/blob/main/CHANGELOG.md

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Ко мне в телеграм канал заглянул один из разработчиков Графини (убийцы Grafana), с пояснением, зачем они её родили, и что писали полностью с нуля.

Я верю.

Теги:
Всего голосов 12: ↑4 и ↓8-4
Комментарии2

Многие крупные компании применяют Go, а спрос на опытных инженеров, владеющих Go, высок как никогда. Онбординг проходит действительно быстро, и у нас есть успешные тому примеры. Все благодаря общей простоте языка и отсутствию function coloring. В карточках рассказываем, как это получилось у Кирилла в 2ГИС↓

Теги:
Всего голосов 6: ↑3 и ↓30
Комментарии4

Хотите подтянуть свои знания Go?

Тогда новый бесплатный курс для вас!

Язык Go называют одним из самых удобных для бэкенда. Дело тут не в примитивности: его специально стремились сделать простым и лаконичным, чтобы пользователям было легко работать с синтаксисом и понимать чужой код.

Если вы уже знакомы с Go, но не хватает практики, приглашаем пройти новый курс в Академии Selectel. С ним вы научитесь писать простые сервисы на Go и использовать его в некоторых рабочих задачах, а еще получите большую подборку ресурсов для погружения в этот язык. 

Несколько материалов для старта.

Открыть курс →

Теги:
Всего голосов 6: ↑6 и ↓0+9
Комментарии1

Бесплатные курсы Route 256 от Ozon Tech для Go-инженеров уровня middle

Route 256 — это эффективная прокачка знаний и навыков работы с микросервисами. Программа курса составлена ведущими экспертами Ozon Tech — командой, которая разрабатывает сервисы, выдерживающие экстремальные нагрузки до 382 000 RPS.

Программа состоит из вебинаров, воркшопов, домашних заданий и их детальных разборов. Причём каждый из этих элементов основан на реальных задачах Ozon. Никаких заданий ради заданий — только действительно актуальные знания и проекты.

Как минимум, они бустанут ваше портфолио. Как максимум, вы получите оффер в команду. Заходите на сайт Route 256, изучайте требования и подавайте заявку.

Отборочный контест уже 3 августа!

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Эффективные хеш-таблицы на Go

В Go нет недостатка хеш-таблиц. Вы всегда можете использовать встроенную map[Key]Val, с ошеломительной скоростью обладающую непревзойденным удобством! А изобилие типов Keyразрешенных к использованию, способно довести до изумления!

Вот только ни указатель, ни слайс не подходят... Невозможно подсунуть свои операции (равенства и хеширования). Но хоть со скоростью все хорошо! (извините, не удержался)

Итого, мне пришлось написать HashMap[K, V any], закрывающую проблемы.

------------------8<------------------

В это трудно поверить, но:

  • Без резервирования памяти (конфигурация R0), map[uint64]uint64 работает в 1.93 раза медленнее UintMap! И производит в 5.64 раза больше мусора!!

  • А с полным резервированием (R1), в 1.72 раза медленнее! И аж в 16.5 раз больше мусора!!!

Вдумайтесь! На коленке написанная хеш-таблица для целых чисел UintMap почти в два раза обгоняет ЖУТКО оптимизированную нативную map[uint64]uint64!! И существенно менее мусорит!!!

Но раз трудно поверить, то давайте проверим:

func MyUintMap() {
    const N = umN

//R0|    um := lib.NewUintMap(0)
    um := lib.NewUintMap(N) //R1|

    for i := uint64(0); i < N; i++ {
        um.Findsert(i, i+N)
    }
    lib.Assert(um.Size() == N)

    cnt := 0
    for i := uint64(0); i < N; i++ {
        if *um.Val(um.Find(i)) == i+N {
            cnt++
        }

        if um.Find(i+N) == -1 {
            cnt++
        }
    }
    lib.Assert(cnt == N*2)

    for i := uint64(0); i < N; i++ {
        um.Delete(i)
    }
    lib.Assert(um.Size() == 0)
}

func GoUintMap() {
    const N = umN

//R0|    m := make(map[uint64]uint64)
    m := make(map[uint64]uint64, N) //R1|

    for i := uint64(0); i < N; i++ {
        m[i] = i + N
    }
    lib.Assert(len(m) == N)

    cnt := 0
    for i := uint64(0); i < N; i++ {
        if m[i] == i+N {
            cnt++
        }

        if _, ok := m[i+N]; !ok {
            cnt++
        }
    }
    lib.Assert(cnt == N*2)

    for i := uint64(0); i < N; i++ {
        delete(m, i)
    }
    lib.Assert(len(m) == 0)
}

Здесь всего-то лишь вставка, два поиска и удаление. Запустите go test -bench=UintMap -benchmem и увидите сами. Вот только можно ли ругать Google за неэффективный map[uint64]uint64?

------------------8<------------------

Итоги?

  1. Смело берите HashMap[K, V any] для слайсов и указателей!

  2. Немного оптимизированная BytesMap -- лучший выбор для []byte.

  3. Интересно оптимизированная UintMap -- это выбор для целых чисел. Разберитесь, что там "не так", и используйте за основу.

И как всегда, исходный код, подробности и пару неудачных шуток вы можете найти в моей статье https://ders.by/go/hashmap/hashmap.html

Теги:
Всего голосов 1: ↑1 и ↓0+2
Комментарии0

Вклад авторов