Обновить
131.06

Go *

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

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

Как не надо использовать Assert, если реализуете подход Design by Contract

Использовать Assert вместо if err != nil { return err}

Одно из неправильных применений Assert — это замена им проверки, которая действительно должна быть и на которую нужно реализовать реакцию в коде.

Выполнять вычисления при вызове Assert

Еще одна распространенная и трудно выявляемая ошибка — это выполнение вычислений и присваивание значений переменным прямо при вызове Assert, которые могут быть упразднены при оптимизации кода компилятором:

  •  e.g. Assert(i++ > 0, “осторожно, не факт, что в релизе i увеличится”),

  •  Assert(call_to_f1(), “осторожно, не факт, что call_to_f1() будет вызвана в релизе”).

Удалять Assert, несмотря на то, что это часть описания контракта

Непонимание, что Assert — это реализация контракта, может привести к тому, что разработчик, незнакомый с DbC, захочет просто удалить проверку. Однако нужно всегда помнить, что срабатывание Assert говорит о нарушении контракта одной из сторон. То есть, если срабатывает Assert, надо прежде всего найти баг и пофиксить. А уж если контракт действительно должен быть изменен, Assert подскажет, где находятся участки кода, на которые нужно обратить внимание.

Например, вызывающая сторона может полагаться на некоторое поведение вызываемого кода. И если вызываемый код существенно изменился и контракт не выполнен, то вызываемая сторона тоже должна быть существенно переосмыслена.

В реализации пакета Go 1.23 fmt-функция Printf всегда возвращает err = nil. И практически все игнорируют возвращающееся значение ошибки, тогда как могли бы проверять постусловие assertion.Assert (err == nil). Так, рано или поздно в последующих версиях можно научить код реагировать на err, отличный от nil.

Как правильно применять assertions, если реализуете подход Design by Contract для улучшения производительности кода в продакшене? Читайте в статье →

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

Приглашаем на первый Cloud․ru Tech Lab: Golang — митап для Go-разработчиков и технических лидеров 🎙️

📅 Дата: 13 марта, 19:00
📍 Место: Москва, Большая Почтовая улица, 40с7, Гоэлро Лофт

В программе четыре доклада от разработчиков Cloud․ru и приглашенного гостя. А еще — нетворкинг и afterparty с диджеем, музыкой и ужином.

Темы докладов:

  • Как устроена Go-разработка в Cloud․ru — Александр Шакмаев и Андрей Рацеров, технические лидеры;

  • Балансировка gRPC в Kubernetes — Михаил Абраш, старший Go-разработчик;

  • Как мы бутстрапим пользовательское окружение с Go, Temporal и Kubernetes — Евгений Третьяков, ведущий Go-разработчик;

  • Осторожно unsafe! Практические примеры и ошибки использования — Владимир Балун, основатель balun․courses.

👉 Зарегистрироваться

А еще заглядывайте в наши статьи и делитесь размышлениями в комментариях:

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

Почему Go — выбор крупных IT-компаний? Узнайте в нашем новом подкасте 🎧

В нем Владимир Балун, основатель Балун.Курсы, пообщался с командой Cloud.ru про тренды в программировании, опыт перехода на Go и подготовку к алгоритмическим собеседованиям.

А еще:

  • как глобальные изменения в отрасли влияют на требования к разработчикам;

  • почему Go стал одним из основных языков для веб-разработки и высоконагруженных приложений;

  • как AI и автоматизация формируют будущее простых задач, таких как верстка.

👉 Посмотреть подкаст также можно на YouTube.

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

Все топовые фичи нового релиза Go

Случился релиз новой версии языка Go: 1.24. Разбираем основные нововведения и используем улучшенные инструменты по максимуму.

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

Смотреть выпуск на YouTube
Смотреть выпуск в VK

Подписывайтесь на канал AvitoTech в Telegram, там мы рассказываем больше о профессиональном опыте наших инженеров, проектах и работе в Авито, а также анонсируем митапы и статьи.

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

Нам нужно больше capacity: как растет вместимость в слайсах на Go

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

На графике видно, что в районе 200 элементов увеличенный слайс вмещает уже 400 элементов, а в районе 800 — 1200, то есть вместимость выросла сначала в два раза, потом — в полтора. 

В коде рантайма можно найти простую формулу: если в слайсе capacity элементов было меньше 256, то вместимость увеличится в два раза. Если больше 256, то на четверть. Таким образом мы пытаемся экономить память.

Существует забавная константа для вычисления вместимости: три четвертых от 256. Разработчики на Go посчитали, что так происходит более плавный переход от фактора 2x к фактору 1.25

Почему на графике образовались «ступеньки» вместо привычной кривой и что еще нужно знать о слайсах Go-разработчику — читайте в статье →

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

Что написать на Go, если «вывод суммы на экран» вы уже переросли

You look lonely... I can fix that.
You look lonely... I can fix that.

На этот вопрос нашел ответ Игорь Горбунов. Он разрабатывает платформу базовой станции в YADRO и второй год изучает Go. Когда стандартные задачи ему надоели, он придумал челлендж: построить приложение, похожее на утилиту ping в UNIX-подобных системах.

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

  • Возможность запросов Echo-Request по протоколам ICMP и ICMPv6 и поддержка IPv4 и IPv6 со стороны ping.

  • Возможность указания целевого узла в виде непосредственно адреса либо в виде имени, что требует поддержки разрешения имен.

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

  • Подсчет и вывод в консоль статистики отправленных запросов, полученных и неполученных ответов, ошибок, минимального, среднего, максимального времени круговой задержки (rtt), а также стандартного отклонения rtt.

Получилось ли у Игоря реализовать настоящий ping и какую проблему ему так и не удалось решить — читайте в статье.

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

Google выпустила новое API для Protocol Buffers в Go

Команда Go представила новое API для работы с Protocol Buffers, получившее название Opaque API. Это важное обновление, которое должно сделать работу с protobuf более эффективной и безопасной. 

До сих пор в Go использовалось так называемое Open Struct API, где все поля структур были доступны напрямую. Например, так:

type LogEntry struct {
  BackendServer *string
  RequestSize   *uint32
  IPAddress     *string
}

С новым Opaque API все поля становятся приватными, а доступ к ним осуществляется через методы:

type LogEntry struct {
  xxx_hidden_BackendServer *string
  xxx_hidden_RequestSize   uint32
  xxx_hidden_IPAddress    *string
  // …внутренние поля опущены
}

// Доступ через методы
func (l *LogEntry) GetBackendServer() string
func (l *LogEntry) HasBackendServer() bool
func (l *LogEntry) SetBackendServer(string)
func (l *LogEntry) ClearBackendServer()
//...

Зачем это сделано?

Новый подход значительно экономит память. Вместо использования указателей для хранения информации о наличии значения в поле (presence), теперь используются битовые поля. В некоторых случаях это позволяет сократить количество аллокаций памяти почти на 60%. (речь идет про элементарные типы, такие как целые числа, булевы и т.д)

Появилась возможность реализовать ленивое декодирование сообщений. Теперь вложенные сообщения декодируются только при первом обращении к ним, а не при общей десериализации. Для некоторых приложений это дает колоссальный прирост производительности и уменьшает аллокации

Новое API предотвращает некоторые ошибки. Например, раньше было легко случайно сравнить указатели вместо значений при работе с enum:

/*
message LogEntry {
  enum DeviceType {
    DESKTOP = 0;
    MOBILE = 1;
    VR = 2;
  };
  DeviceType device_type = 1;
}
*/

// Неправильно и незаметно:
if cv.DeviceType == logpb.LogEntry_DESKTOP.Enum()

// Правильно:
if cv.GetDeviceType() == logpb.LogEntry_DESKTOP

С новым API такая ошибка просто невозможна, так как прямого доступа к полям нет.

Еще одно улучшение касается работы с reflection. Раньше разработчики могли случайно использовать стандартный пакет reflect вместо специального protobuf-reflection, что приводило к неожиданным результатам. Теперь такие ошибки исключены.

Google предлагает постепенный путь миграции через "гибридное" API, которое поддерживает оба способа работы. Для новых проектов рекомендуется сразу использовать Opaque API. В 2024 году оно станет стандартным подходом в новой версии Protocol Buffers (Edition 2024).

Старое API никуда не исчезнет – принцип обратной совместимости. 

Для перехода на новое API Google предоставляет инструмент open2opaque, который помогает автоматически переписывать код. Внутри самого Google большинство protobuf-файлов уже переведено на новое API, и оно активно используется на проде.

cross-пост из tg-канала Cross Join

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

Последний Go-митап в этом году: как Go меняет подходы к разработке и тестированию

Уже через несколько часов, в 19:00, начнется онлайн-трансляция финального в этом году Go-митапа, где разработчики и технические лидеры сообщества обсудят инструменты кодинга на Go. В мероприятии примут участие эксперты из YADRO, Wildberries, Weborama и Ви.Tech. Регистрируйтесь на онлайн-участие. 

Программа:

Приветственное слово: Руслан Барсуков, ведущий инженер по разработке ПО в YADRO, и Виталий Левченко, технический менеджер в Wildberries, расскажут о планах Go-сообщества в Нижнем Новгороде.

«Генерация стабов для тестирования микросервисов по gRPC»

Кирилл Шувалов, разработчик дивизиона Телеком в YADRO, покажет, как с помощью Protoc стандартизировать тесты, упрощая их написание и повышая читаемость.

«Стриминг данных из Snowflake в Couchbase»

Александр Ванюшкин, разработчик в Weborama, поделится опытом создания плагина для Redpanda/Connect для оперативной обработки данных.

«Сборка проектов на Go: от Make до Mise»

Даниил Подольский, эксперт по разработке ПО в YADRO и один из лидеров внутреннего Go-сообщества, расскажет о развитии инструментов сборки и выборе оптимальных решений.

«Почему мы пилим монолит без микросервисов»

Кирилл Кузин, старший golang-разработчик, Ви.Tech, объяснит, как команда поддерживает сложную архитектуру и избегает ошибок при распиле монолита.

Пришлем ссылку на онлайн-трансляцию после регистрации на сайте →

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

Чего не стоит делать в Go?

О типичных ошибках при разработке на Go рассказывает наш бэкенд-инженер и автор одноимённого канала Олег Козырев. Что в докладе: 

  • встраивание типов и устройство мапов; 

  • возможные протечки и кастомные ошибки;

  • разбор интерфейсов и грамотная обработка багов. 

И всё это — в компании одного очаровательного кота. 

Подписывайтесь на канал AvitoTech в Telegram, там мы рассказываем больше о профессиональном опыте наших инженеров, проектах и работе в Авито, а также анонсируем митапы и статьи.

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

Итоги облачного IT-турнира от Cloud.ru и Хабр🏆

18 ноября завершился наш облачный IT-турнир — интеллектуальное IT-соревнование для профи по направлениям DevOps, Go и кибербезопасность. 

Напомним, что участники соревнования должны были решить все задания за 50 минут и набрать как можно больше баллов. Турнирная таблица обновлялась в режиме реального времени — мы с интересом следили за тем, как IT-специалисты устанавливают новые рекорды. 

Свои навыки решили проверить 892 участника, а 537 из них стойко дошли до самого конца и выполнили все задания 🦾. В итоге в лидеры вырвались:

В лиге DevOps:

🥇1 место  — @evgeniy_fyodorov, 1437 очков. 

🥈2 место — @Kciod, 1290 очков. 

🥉3 место — @dimadragon, 1219 очков.

В лиге Go:

🥇1 место  — @smetanin, 2843 очков. 

🥈2 место — @melpnz, 2778 очков.

🥉3 место — @itas, 2745 очков.

В лиге кибербезопасности:

🥇1 место  — @T_Frost, 1868 очков. 

🥈2 место — @KiraCoder, 1814 очков.

🥉3 место — @georgybelyakov, 1787 очков.

Поздравляем! Они получат ачивку победителя и карьерную консультация от Марины Ломадзе — руководителя рекрутмента в Cloud․ru. Мы уже начали связываться с победителями, чтобы рассказать, как получить заслуженные призы😊.

А у всех хабраюзеров, которые верно решили более половины заданий турнира, появятся ачивки IT-Лиги в профиле на Хабре.

Хотите узнать правильные ответы на задания IT-турнира? Ставьте плюс в комментариях, а также указывайте номер или название задания. Если наберется много желающих, позже мы сделаем небольшой обзор с решениями.

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

Присоединяйтесь к облачному IT-турниру от Cloud.ru и Хабр🏆

Почти 400 IT-специалистов уже поучаствовали в соревновании для профи и проверили свои навыки по направлениям DevOps, Go и кибербезопасность на облачном IT-турнире. А вы готовы принять вызов?🦾

Что нужно для участия

  • до 18 ноября зарегистрируйтесь и выберите лигу: DevOps, Go или кибербезопасность;

  • решите как можно больше задач за 50 минут — чем больше правильных ответов, тем выше будет ваше место в рейтинге, который обновляется в режиме real-time.

Какие будут призы

  • если наберете 50% правильных ответов, получите ачивку IT-Лиги в профиле на Хабре;

  • если войдете в топ-3 в выбранной лиге, получите ачивку победителя и карьерную консультация от Марины Ломадзе — руководителя рекрутмента в Cloud․ru. На консультации сформируете план развития и получите советы, как выгодно презентовать свой опыт на интервью и вести диалог о повышении.

Хотите занять призовые места в рейтинге? Тогда участвуйте в IT-турнире, выигрывайте и забирайте призы🎁 

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

IT-турнир от Хабра и Cloud.ru: первые итоги

18 октября Хабр и Cloud.ru запустили хардовое соревнование для профи в IT. Уже 2 недели участники Облачного IT-турнира сражаются за вершину рейтинга по трём направлениям: DevOps, Go и кибербезопасность. 

Мы же внимательно следим за соревнованием и результатами, которые обновляются в режиме real-time. Ниже список юзеров Хабра, которые вошли в ТОП (по данным за 31 октября). Поздравляем!

Если вашего имени еще нет в турнирной таблице — скорее регистрируйтесь, выбирайте Лигу и покажите свои знания.

Мы подарим ачивки на Хабре тем, кто решит половину теста правильно. А топ-3 победителей по каждому направлению заберут победную ачивку и получат главный приз — индивидуальную карьерную консультацию. Там они сформируют планы развития и получат советы, как выгодно презентовать свой опыт на интервью и вести диалог о прибавке.

Наш турнир продлится до 18 ноября 2024 года. Рассчитываем, что гонка будет жаркой!

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

Я вот не понимаю, почему Го преподносится как  post-OOP язык, в то время как это явно пре-ООП язык, чисто императивный. Как Бейсик (который не Вижуал) или Паскаль.

И это явно не прогресс, а регресс в подходе к методологии.

Хотя, очевидно, он выигрывает у языков с управляемой средой, да. Управляемая среда (ВМ) требует слишком много ресурсов для старта и разогрева. А в микросервисах это вообще не нужно.

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

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

Go 1.23: обзор основных изменений в релизе

Павел Агалецкий, ведущий разработчик команды Платформы в Авито, отвечает на следующие вопросы в этом видео:

  • выход в релиз range over func — какие новые возможности это открывает для работы с циклами?

  • добавлен пакет iter — как он упрощает написание функций итераторов?

  • внесены изменения в поведение таймеров — как это облегчает разработку?

А ещё вы узнаете о новом пакете unique и расширении уже имеющихся slices и maps. Приятного просмотра!

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

Всем привет!

У нас есть два стула…Python и Go. Хоть немного зная один из этих языков, девопс может делать в Kubernetes разную магию.

Завтра встретимся с Виталием Лихачевым, SRE в Bооking.сom,ex-Avito Senior Software Engineer, на вебинаре, чтобы разобрать:

• Как использовать k8s как API, даже не зная его устройства? 
• Как создать при этом симбиоз между кодом и целым кластером?
• Как в k8s объединять бизнес-логику и инфраструктуру с помощью миллионов строк кода?

Всё это — на примерах Python и Go.

А ещё можно:

• Контролировать соответствие манифестов архитектуры стандартам — и при этом не ходить по репозиториям и не править манифесты руками 
• Подключать различные sidecar контейнеры для сбора логов и метрик —  и не мешать этим разработчикам
• Делать это всё на лету.

И мы постараемся показать, как. А уж на какой из стульев садиться — выбор за вами)

Дата и время — 21 августа, 19:00 мск 
Занять место на вебинаре — по ссылке.

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

Вышел Go 1.23!

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

В этом посте я напишу все основные изменения в новой версии Go:

  1. Range-over func

    Эксперимент с range-over func теперь основательно является частью Go

    Подробнее про range-over func читать здесь: https://go.dev/wiki/RangefuncExperiment

  2. Телеметрия

    Добавили Go Telemetry для отслеживания работы Go Toolchain. Сами разработчики Golang советуют включить эту опцию, так как она еженедельно будет анонимно отсылать информацию на https://telemetry.go.dev/ для улучшения работы Toolchain

    Подробнее про команду "go telemetry" читать здесь: https://pkg.go.dev/cmd/go#hdr-Manage_telemetry_data_and_settings

  3. Таймер

    Изменения также коснулись и "time.Timer" и "time.Ticker"

    Во-первых - "Тикеры" и "Таймеры", не упоминающиеся программой - становятся допустимыми для сборки мусора, даже если не был вызван метод "Stop"

    Во-вторых - теперь каналы "Таймера" и "Тикера" не буферированы. Это объясняется тем, что для вызова методов Reset или Stop не будет устаревших подготовленных значений

  4. Unique

    Добавлен новый пакет "unique": https://pkg.go.dev/unique

  5. Iter

    Добавлен новый пакет "iter": https://pkg.go.dev/iter

  6. Slices

    В пакет "slices" добавили несколько функций, которые работают с итераторами: https://go.dev/doc/go1.23#iterators

  7. Maps

    В пакет "maps" тоже добавили несколько функций для работы с итераторами: https://go.dev/doc/go1.23#iterators

  8. Structs

    Добавлен новый пакет "structs", который предоставляет новые типы для struct-полей: https://pkg.go.dev/structs

Это и еще многое читайте на официальном сайте Go!

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

Go: маршрутизация без лишних пакетов

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

Недавно я открыл для себя “net/http” - роутер, который изначально есть в Go. В этом посте я опишу его удобство и, возможно, Вы - как и я, начнете его использовать, пусть он и не такой быстрый, как маршрутизаторы, основанные на fasthttp.

1. Не надо подключать сторонние пакеты

Достаточно только написать строку import “net/http”. Не надо подключать сторонние пакеты и тратить время на написание команд в консоли

2. Отличные возможности

В нем есть почти все то, что есть современных маршрутизаторах по типу Chi или GoFiber. Это очень удобно

3. Возможность расширения

Вы сами пишете многие функции. Значит, что не ограничены возможностями роутера

4. Контроль

Многое придётся делать самому ⇒ Вы будете знать, почему и как все происходит

Многое придётся делать своими руками, а в таком случае будете знать, почему и как все работает

Но, конечно, есть минусы:

1. Middleware

Придется писать все middleware собственными руками

2. Скорость

Он не такой быстрый, как роутеры, написанные с использованием fasthttp

3. Ошибки

Думаю, для многих это будет самым большим минусом. Нельзя возвращать ошибки из хэндлеров

Напишите в комментариях каким роутером пользуетесь Вы и почему именно им!

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

Привет, Хабр! Сегодня я буду усиленно делать вид, что понимаю, что такое формат поста на Хабре и для чего его можно использовать.

Я сейчас занимаюсь фулл-тайм инди разработкой игр на Go и у меня много всего, чем я мог бы поделиться. Есть как уже выпущенное в Steam, так и грядущие релизы. Множество новых собственных и освоенных 3rd party библиотек.

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

Если хочется обсудить внутри сообщества: https://t.me/go_gamedev

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

Разработчик и руководитель Рас Кокс (Russ Coxобъявил об уходе с поста лидера проекта по разработке языка программирования Go, который он занимал последние 12 лет. В качестве причины ухода упоминается желание обеспечить сменяемость руководства, без которого проект может оказаться в застое. Предполагается, что смена лидера создаст условия для роста проекта, позволит по-новому взглянуть на вещи и даст возможность совершить новый шаг вперёд.

Рас Кокс пояснил, что для него настало время для изменений, но он не покидает проект и продолжит участие в разработке, но уже не на месте лидера. После ухода с руководящей должности Рас планирует сосредоточиться на развитии системы отслеживания ошибок, бота автоматического реагирования на сообщения о проблемах Gaby и платформы для автоматизации сопровождения кода Oscar.

С первого сентября за техническую часть разработки будет отвечать Остин Клементс (Austin Clements), который также возглавит команду, занимающуюся разработкой Go, в компании Google. Ранее Остин отвечал в проекте за компилятор, runtime и выпуск релизов. После повышения Остина за данные компоненты теперь будет отвечать Черри Муи (Cherry Mui).

Источник: OpenNET.

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

Go для веб-разработки

Взято с https://www.linkedin.com/pulse/exploring-go-language-web-development-muhammad-irfan-q3nvf

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

Одна из тех вещей, которыми я занимаюсь с использованием Go — веб разработка. Я могу написать как фулл‑стэк вебсайт, так и просто бэкэнд. В этом коротком посте я дам Вам несколько советов и практик по веб‑разработке с использованием Golang

1. Роутеры

Есть много роутеров, и я советую попробовать каждый, чтобы найти лучший для себя. Но если Вы не хотите этого делать, то вот несколько хороших роутеров:

  1. Chi router — роутер, которым я пользуюсь. Полная совместимость со стандартным пакетом Go

  2. Go fiber — скоростной роутер

2. Jet templates

Очень удобная библиотека для использование темплэйтов. Очень упростила мне жизнь, если Вы пользуетесь теплэйтами в Go — упростит и Вам

3. Используйте middleware

Не используете middleware — ошибка. Не используете встроенные в пакет роутера middleware — фатальная ошибка. Есть очень много хороших middleware, которые уже встроены в используемый Вами роутер, например — Chi. Очень полезно использовать «Recoverer», или подобные.

4. Используйте аккуратную и удобную Вам структуру проекта

Не создавайте все файлы вместе. Разбейте все по папкам, как удобно Вам, в интернете есть много примеров

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

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

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