[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Как стать автором
Обновить
138.2

Go *

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

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

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
Комментарии1
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
Комментарии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

Используем Redis на всю катушку

Всем привет!

Кто знаком с Redis — чаще всего используют его для простого кеша. А можно ещё и для текстового поиска, для сбора аналитических событий, для гео поиска, для стриминга событий и многого другого.

Сегодня в 19:00 покажем это на примерах Golang на вебинаре «Gони, Redis, Gони! Как использовать Redis за пределами key-value storage?».

Встретимся с Виталием Лихачёвым, Ex-Avito Senior Software Engineer и SRE в Booking.сom, чтобы поговорить про все варианты эксплуатации Redis.

Внутри:

▶️ Вторичные индексы, распределенные блокировки, полнотекстовый поиск
▶️ Паттерны использования Redis и работу Redis со стороны эксплуатации

🗓 31 июля в 19:00 по Москве
➡️ Регистрация на вебинар — с помощью бота.

Приходите!

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

Golang: лучшие практики

Взято с https://github.com/golang/go
Взято с https://github.com/golang/go

Вы новичок в Golang? Или сомневаетесь, что пишете код правильно? Тогда вот лучшие практики при написании кода на Golang, большинство которых взято с “Effective Go”, а некоторые, применимые ко всем языкам программирования - с книги “Чистый Код

1. Названия функций-геттеров

Не надо в Golang писать названия функций-геттеров с приставкой “Get”.

То есть, вместо func GetUser() , пишите func User() . Но это не применимо к функциям, которые начинаются с маленькой буквы

2. Названия функций-сеттеров

В отличии от функций-геттеров, функции-сеттеры необходимо писать с приставкой “Set”.

То есть, если Ваша функция - сеттер юзера, пишите func SetUser(). Но это так же не применимо к функциям, которые начинаются с маленькой буквы

3. Названия однометодовых интерфейсов

Если Ваш интерфейс однометодовый, то по соглашению его названием должно являтся название метода + суффикс “er”. Например: “Reader, Writer, Formatter и т.д”

4. Избежание перераспределений

При создании среза, используйте make с указанием длины. Так Вы избежите перераспределений, что сделает Вашу программу чуть быстрее (больше советов про скорость программ на Golang есть в моём посте)

5. Тесты

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

6. Размер функций

Не пишите огромные функции. Постарайтесь не превышать 30 строк кода. Разбейте ее на много маленьких!

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

5 библиотек Golang для эффективной разработки веб-приложений

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

1. CHI Router

Как по мне, самая лучшая библиотека для веб разработки. Полная совместимость с роутером голанга, а также большое кол-во middleware - вот главные плюсы Chi router. Им я пользуюсь на постоянной основе

2. Go Fiber

Если Вам не понравился Chi router - есть Go FIber. Быстр, но нет совместимости со встроенным роутером. Если для Вас это не проблема - используйте его. Для меня его преимущества - скорость и возможность возвращать ошибки из хэндлеров

3. Jet templates

Насколько сильно мне упростила эта библиотека жизнь. Наипростейшее использование темплэйтов в Golang. Если Вам не нравится встроенное их использование, Jet - Ваше спасение

4. Scs

Отличный менеджер сессий. Если Вам надо использовать сессии - Scs

5. CHI Render

Отличная библиотека от тех же людей, что сделали CHI router. Помогает работать с HTTP запросами

На этом все, но могу также порекомендовать такие библиотеки, как testify для упрощения написания тестов и cleanenv для чтения конфига, ведь это так же важно.

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

Чем занимаются Go-специалисты в Островке?

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

  • Адаптируют API различных поставщиков к внутреннему API сервиса. Внешние поставщики отелей используют разные технологии: GraphQL, XML, SOAP, WTF. В каждом API своё время ответа, свои коды ошибок и ещё много кастомного. 

  • Поддерживают и правят существующие интеграции. Протокол сменился, или (куда реже) коды ошибок стали другие — всё надо держать в актуальном состоянии и при необходимости править.

  • Уменьшают технический долг. Это задачи, связанные с библиотеками и рефакторингом. Есть правило — на одну итерацию должно приходиться 75% продуктовых задач и 25% техдолговых.

  • Дежурят в общем чате. В нём разработчики отвечают на вопросы менеджеров. Раньше дежурств не было, на вопрос отвечал тот, кто увидел его первым. Когда поток обращений вырос, решили назначать дежурного.

  • Обмениваются знаниями внутри компании. В Островке есть активности, напрямую не связанные с работой. Например, канал в слаке #dev-golang и еженедельный книжный клуб.

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

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

Go: Раскрытие потенциала скорости

Я всегда борюсь за скорость. Началось это все с того, как я прочитал книгу “Грокаем алгоритмы” и меня заинтересовало измерение скорости выполнения. Потом, решая задачи на LeetCode я расстраивался, если алгоритм получался медленным. Недавно мне пришла идея написать пост на эту тему, а во время написания изучить этот вопрос получше. Я прочитал не мало статьей, большинство из которых - англоязычные.Так что вот советы по увеличению скорости Вашего приложения на Golang :

1. Выделять ёмкость для среза с помощью make

При создании среза выделяйте ёмкость с помощью make, так Вы избавитесь от перераспределений

2. При возвращении указателя, объявлять его при создании переменной

 func (r Ruleset) Match(path string) (*Rule, error) {
 	for i := len(r) - 1; i >= 0; i-- {
		rule := r[i] //так НЕ надо
		rule := &r[i] //так надо
 		match, err := rule.Match(path)
 		if match || err != nil {
			return &rule, err //так НЕ надо
			return rule, err //так надо
 		}
 	}
 	return nil, nil
}

3. Пишите бенчмарки

Пишите бенчмарки для вашего приложения, так Вы поймете, в каком месте оно работает медленнее всего. Источник для того, чтобы научиться писать бенчмарки: https://dave.cheney.net/2013/06/30/how-to-write-benchmarks-in-go и др.

4. Используйте горутины!

Когда есть возможность, используйте горутины. Например, когда результат 2-х операций не зависит друг от друга, можете использовать горутины. Думаю, доказывать, что таким образом приложение становится быстрее, не надо :)

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

Эта программа сериализует данные из слайса структур User в JSON-формат. Но есть одна проблема: программа не работает. Нужно найти ошибку и исправить её. Когда программа заработает, она выведет данные на экран в JSON-формате.

import (
  "encoding/json"
  "fmt"
)

type User struct {
  id       int    `json:"id"`
  name     string `json:"name,omitempty"`
  email    string `json:"email,omitempty"`
  password string `json:"-"`
}

func main() {
  users := []User{
    {
      id:       1,
      name:     "Gopher",
      email:    "gopher@example.com",
      password: "Im4G0pH3r",
    },
    {
      id:       2,
      name:     "Rustocaen",
      email:    "rustocean@example.com",
      password: "iT$Ru$t0C34n",
    },
  }

  out, err := json.MarshalIndent(users, "", "    ")
  if err != nil {
    fmt.Printf("serialization error: %s\n", err.Error())
    return
  }

  fmt.Println(string(out))
}

Решение задачи опубликуем в комментариях.

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

Что почитать начинающим разработчикам на Go

Привет, Хабр! Меня зовут Алексей Артамонов, я лид команды интеграции в «Островке». Сделал подборку, что можно почитать для старта работы с Go:

  • «The Go programming language» — азы для старта. Хотя синтаксис в Go простой, важно уметь из этих простых вещей собирать сложные конструкции. 

  • Effective Go — практическое пособие для создания тех самых сложных конструкций.

  • «Сто ошибок в Go» — ещё одна хорошая книга. Заход со стороны «как делать не надо».

  • В различных обучающих программах очень много внимания уделяют монолитам, микросервисам и в принципе архитектуре. Но правда в том, что джун или мидл вряд ли столкнётся со столь глобальными задачами. Ему важнее уметь разбить свою логику по классам, пакетам, модулям. Важно писать качественный код. Для этого обязательно рекомендую книгу «Good code, bad code».

  • Много полезного в книге «Принципы юнит-тестирования». Хорошие юнит-тесты неразрывно связаны с тем, как приложение разбито на модули, какие есть связи и зависимости.

  • Два блога-рассылки: GoLang Blog и Awesome Go Weekly.

  • Подкасты довольно сложны для восприятия в фоновом режиме. Особенно для новичков. Но если очень хочется: GoTime, GoPodcast и GoGetPodcast.

Обучение пройдёт легче, если уже знать какой-нибудь язык программирования. К примеру, в «Островке» два главных языка — Python и, собственно, Go. Главный секрет — желание и практика. Если хочешь стать программистом — надо сесть и начать кодить. Ни одна книга без практики не поможет стать программистом.

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

Всем привет, прошел уже 1 месяц с того момента как я опубликовал свою первую статью на habr и около 2,5 месяцев с первого дня разработки моей игры. В этом посте я бы хотел рассказать о прогрессе, которого я смог достичь за то время, которое прошло с момента последней публикации.

В обновлении я добавил такое как:

  • Возможность разобрать блоки обратно в материалы

  • Добавил множество строительных блоков и блоков интерьера

  • Переписал процедурный генератор мира и добавил новые структуры

  • Добавил рабочие инструменты и обновил принцип добычи материалов, теперь вам нужно иметь кирку, чтобы добывать камень, вам нужно иметь топор, чтобы добывать древесину

  • Написал систему проигрывания саундтреков

  • Теперь обновления мира из новых версий игры вносятся в старый игровой мир, таким образом все новые структуры будут доступны также и в старом мире

  • Провел оптимизацию рисовку игрового мира

  • Теперь игра доступна не только для Windows, но еще и для Linux

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

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

6 июня. Golang meetup в московском офисе Ситидрайва

6 июня ждем вас в московском офисе Ситидрайва на камерный Golang митап!

Инженеры из команды Ситидрайва, VK рекламы и E-com Tech расскажут о сервисах на Golang: только кейсы из практики и личный опыт. В завершение каждого доклада можно будет задать вопросы и пообщаться со спикерами в неформальной обстановке. 

Программа:

18:15-18:30 | Сбор в офисе Ситидрайва, знакомство и Welcome

18:30-19:00 | Доклад «Не Go единым»

Спикер: Вячеслав Морозов — Head of Backend разработки клиентских сервисов в Ситидрайве

19:10-19:40 | Доклад “Использование Kafka с Golang: Оптимизация эффективности обработки сообщений”

Спикер: Симоне Кабрино — Руководитель команды в e-com.tech (ранее samokat.tech), которая разрабатывает Customer Data Platform

19:40-20:10 | Нетворкинг

20:10-20:40 | Доклад «Жизнь в продакшене сервиса на Go»

Спикер: Иван Ремень — Руководитель разработки рекламного ядра в VK рекламе

20:45-21:15 | Доклад «C? Go? Cgo! — Интеграция библиотек на C в проектах на Golang»

Спикер: Иван Сорокин — Руководитель команды разработки, которая отвечает за все финансовые истории внутри приложения Ситидрайва

21:15-22:00 | Нетворкинг

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

Билетов на мероприятие всего 70. Участие бесплатное, но регистрация по ссылке обязательна. Для входа в офис потребуется паспорт или водительское удостоверение.

До встречи!

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

Go SDK
Будучи скромным гофером хочу отметить, что решение тех или иных задач - требует понимание базы и идиом языка. Конечно, есть замечательная документация, есть не менее замечательный хаб, но пока самые-самые сердечки это репозитория go, где в центре внимания легендарный пакет runtime и sync.
Вот несколько примеров, как описан sync.Map в коде, комментарии к которому и реализация методов отвечает на многие вопросы

//...
// Load, LoadAndDelete, LoadOrStore, Swap, CompareAndSwap, and CompareAndDelete
// are read operations; Delete, LoadAndDelete, Store, and Swap are write operations;
// LoadOrStore is a write operation when it returns loaded set to false;
// CompareAndSwap is a write operation when it returns swapped set to true;
// and CompareAndDelete is a write operation when it returns deleted set to true.
type Map struct {
//...
// Range may be O(N) with the number of elements in the map even if f returns
// false after a constant number of calls.
func (m *Map) Range(f func(key, value any) bool) {
	// We need to be able to iterate over all of the keys that were already
	// present at the start of the call to Range.
	// If read.amended is false, then read.m satisfies that property without
	// requiring us to hold m.mu for a long time.
	read := m.loadReadOnly()
	if read.amended {
		// m.dirty contains keys not in read.m. Fortunately, Range is already O(N)
		// (assuming the caller does not break out early)...
    ...

Всем приятного копания базы и профессионального роста.

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

В go 1.22 провели изящный рефакторинг части когда по увеличение емкости среза на x1.25 относительно порога значения емкости в 256.
Не большой тест на arm M1 Pro:

const threshold = 256 
//v 1.21
func BenchmarkName121(b *testing.B) {  
  var newcap = threshold  
  var newLen = 100_000_000_000  
  for 0 < newcap && newcap < newLen {   
    newcap += (newcap + 3*threshold) / 4 
  }  
  if newcap <= 0 {   
    newcap = newLen  
  }
}

//v 1.22
func BenchmarkName122(b *testing.B) {
  var newcap = threshold 
  var newLen = 100_000_000_000  
  for {    
    newcap += (newcap + 3*threshold) >> 2    
    if uint(newcap) >= uint(newLen) {   
      break   
    }  
  }
}

В 8 из 10 прогонов результат одинаковый, в оставшихся - 121 показывает лучший результат
В 8 из 10 прогонов результат одинаковый, в оставшихся - 121 показывает лучший результат

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

Питонисты! В 19:00 начинаем транслировать Selectel Python Meetup.

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

Смотрите трансляцию прямо в этом посте или переходите на YouTube.

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

28 марта в 19:00 мы проведем Selectel Python Meetup для разработчиков, техлидов и тимлидов разработки. Соберем экспертов из Selectel, Банка Точка и Yandex.Cloud. Обсудим «еще один» быстрый фреймворк, плюсы и минусы чистой архитектуры, опыт перехода с Python на Go.

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

  • «Черная овечка на фоне FastAPI»,

  • «Слоистая архитектура в Python-приложениях: гибкость кода vs оптимизация»,

  • «Перешел с Python на Go. Лучше стало?».

Регистрируйтесь на митап — будем ждать вас в онлайн-трансляции или в офисе Selectel.

Регистрация →

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

На GitHub под лицензией Apache License 2.0 опубликован проект под названием Nuke v1.1.0. Это реализация арены памяти для Go с бенчмарками и даже реализацией параллельной арены.

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

  • повышение производительности: распределяя память большими блоками, арены памяти сокращают накладные расходы, связанные с частыми вызовами системного распределителя памяти;

  • Улучшенная локальность кэша. Арены памяти также могут улучшить локальность кэша, размещая тесно связанные объекты в одном блоке памяти;

  • эффективность сборки мусора. Использование арен памяти может снизить рабочую нагрузку на сборщик мусора за счёт уменьшения количества объектов, которые необходимо отслеживать и собирать, что приводит к меньшему времени паузы и более предсказуемой производительности.

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

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

Проклятие дженериков 💀

Дженерики могут показаться очень простой темой.
Например, вот так в Java выглядят классные и простые методы интерфейса List:

interface List<E> extends Collection<E> {
	boolean add(E e);
	E set(int index, E element);
}

Но у обобщений много нюансов: вложенность, вариантность, границы и т.д. Это сильно усложняет их использование.
Вот не менее классный, но совсем непростой flatMap интерфейса Stream🙈:

interface Stream<T> extends BaseStream<T, Stream<T>> {
	<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
}

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

Из-за таких сложностей, в языке Go (философия которого - простота и минимализм) дженерики появились аж через 12 лет после релиза языка. А первый коммент про то что нужны дженерики появился меньше чем через 24 часа🙃

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

  • С++ вышел в 1979, дженерики - 1986

  • Java - 1996, дженерики - 2004

  • C# - 2001, дженерики - 2005

  • Go - 2009, дженерики - 2021

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

Поделитесь с командой создателей Go своими отзывами о разработке с помощью этого языка программирования.

Опрос для разработчиков Go 2024 открыт, и мы хотим услышать ваше мнение!

С 2016 года данные опросов разработчиков Go помогают нам определять ключевые модели использования, понимать проблемы разработчиков, узнавать предпочтения в отношении инструментов и отслеживать новые тенденции в сообществе. Ваши отзывы очень важны для формирования будущего Go, поэтому, пожалуйста, уделите 10–15 минут, чтобы заполнить опрос до 11 февраля 2024 года. Примите участие в опросе прямо сейчас!

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

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

Хитрый способ в PostgreSQL перебрать всю таблицу медленно и аккуратно, но эффективно, используя указатель ссылающийся на конкретный tuple - ctid.

	var endBlock int
	row := db.QueryRow(ctx, `select relpages from pg_class where oid = 'table1'::regclass::oid`)
	err = row.Scan(&endBlock)
	if err != nil {
		return
	}

	startBlock := 0
	blocksPerIteration := 50
	maxTuplesPerBlock := 150

	for {
		var rows pgx.Rows
		rows, err = db.Query(ctx, `
				select id
				from table1
				where ctid = any (
					array(
    					select format('(%s, %s)', a, b)::tid
    					from generate_series($1::int, $2::int) a(a)
							cross join generate_series(0, $3) b(b)
					))
					and value = '100000'`,
			startBlock,
			startBlock+blocksPerIteration,
			maxTuplesPerBlock,
		)
		if err != nil {
			return
		}
		var id int
		for rows.Next() {
			err = rows.Scan(&id)
			if err != nil {
				return
			}

			slog.Info("found row", "id", id)
		}
		rows.Close()

		startBlock += blocksPerIteration
		if startBlock > endBlock {
			break
		}
		time.Sleep(100 * time.Millisecond)
	}

Нюансы:

  • из-за того что тип tid не оптимизирует операции больше/меньше, приходится использовать ctid = any (...)

  • для определения maxTuplesPerBlock можно использовать запрос

select 8096 / min(x)
from (
    select pg_column_size(table1) x
    from table1 tablesample system(1)
) d
  • можно делать не только select , но и update и delete, но помнить что строки могут и перемещаются как внутри блока, так и между ними

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

Небольшой пример как копировать данные между базами данных используя go, pgx, и copy.

Предположим что у нас есть два коннекта к базе (одной или нескольким, это не важно). Далее используя io.Pipe() создаём Reader и Writer, и используя CopyTo() и CopyFrom() переносим данные.

  r, w := io.Pipe()

  go func() {
      _, err := db1.PgConn().CopyTo(ctx, w, `copy table1 to stdout binary`)
      if err != nil {
          slog.Error("error", "err", err)
          return
      }
      _ = w.Close()
  }()

  _, err = db2.PgConn().CopyFrom(ctx, r, `copy table1 from stdin binary`)
  _ = r.Close()

Вся прелесть тут в том что используем наиболее быстрый способ с точки зрения PostgreSQL.

Используя copy (select * from where ... order by ... limit ...) to stdout можем регулировать нагрузку на чтение, следить за прогрессом и управлять копированием данных.

В качестве Reader может выступать что угодно, хоть файл csv, хоть другая СУБД, но тогда данные придётся дополнительно конвертировать в формат понимаемый PostgreSQL - csv или tsv, и использовать copy ... from stdin (format csv).

Нюанс: copy ... from stdin binary , binary обязывает использовать одинаковые типы данных, нельзя будет integer колонку перенести в колонку smallint, если такое требуется, то параметр binary надо опустить.

Весь код туть. И ещё немного кода для вдохновения.

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

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

Работа

Go разработчик
78 вакансий