Golang Дайджест
7.49K subscribers
37 photos
1 file
154 links
Самое интересное из мира Go: новости, статьи, проекты, сервисы, изменения в языке и др.

Посты публикуются не часто - только самое важное, с чем я лично ознакомился.

Поэтому можно не мьютить канал =)

Обратная связь: @justskiv
Download Telegram
Сколько ты зарабатываешь? 😄
Опрос анонимный, интересуют только Go-разработчики. Грейд не важен.
Anonymous Poll
9%
< 100 тыс р
15%
100-200 тыс р
11%
200-300 тыс р
8%
300-400 тыс р
3%
400-500 тыс р
3%
500+ тыс р
51%
Я не Go-разработчик / Посмотреть ответы
Публичное Code Review

https://youtu.be/oqBTz3E19GA

Недавно в сообществе Gopher Club разгорелась жаркая дискуссия по поводу проекта одного из участников, которая переросла в спонтанный сеанс публичного код ревью от Глеба (одного из участников GoGetPodcast).

В итоге автор проекта получил очень ценный фидбэк, а мы получили крутой контент 💻

#video #codereview
Please open Telegram to view this post
VIEW IN TELEGRAM
Какой вам кажется более простым, читаемым, понятным? Ниже будет голосование.

Либо можете предложить свой вариант в комментариях к этому посту.

Обсуждаем только кодстайл, а не адекватность кода в целом
Options vs Builder Pattern

https://medium.com/@MTrax/golang-options-vs-builder-pattern-4123bfcc3c5c

Автор статьи рассматривает два паттерна для создания сложных объектов с опциональными параметрами - Options Pattern и Builder Pattern, их преимущества, недостатки и примеры реализации.

Options Pattern

Пример использования:

pizza := NewPizza(
WithDough("Regular"),
WithSauce("Tomato"),
WithCheese("Mozzarella"),
WithToppings([]string{"Pepperoni", "Olives", "Mushrooms"}),
)

Плюсы:
- Легкость использования
- Читаемость кода
- Более краткий и компактный код

Минусы:
- Может стать громоздким в использовании
- Меньше гибкость

Builder Pattern

Пример использования:

builder := NewConcretePizzaBuilder()
director := NewDirector(builder)
pizza := director.Construct()

Метод Construct:

func (d *Director) Construct() *Pizza {
return d.builder.
SetDough("Thin Crust").
SetSauce("Tomato").
SetCheese("Mozzarella").
SetToppings([]string{"Mushrooms", "Olives", "Onions"}).
Build()
}

Плюсы:
- Четкое разделение конструкции объекта от его представления
- Гибкость: позволяет создавать разные представления объекта с одним процессом конструкции
- Легко добавлять новые параметры

Минусы:
- Более более сложная и многословная реализация
- Больше абстракций
- Может быть избыточным
————

Как обычно, выбор между Options и Builder зависит от специфических потребностей вашего проекта

#golang #patterns #english
Каким аргументом вы передаёте логгер?

К примеру, контекст принято передавать 1-м параметром. А с логгером четкого соглашения нет. Примеры: 1) `NewService(ctx, log, arg1, arg2)` 2) `NewService(ctx, arg1, arg2, log)`
Anonymous Poll
30%
Как в примере (1) - т.е. после контекста, либо 1-м если ctx нет
26%
Как в примере (2) - т.е. последним
11%
Не задумываюсь и делаю везде по разному
7%
Другое, напишу в комментах
25%
Не знаю / посмотреть ответы
Какой тип данных используется внутри каналов Go для организации и управления буфером?
Anonymous Quiz
10%
Динамический массив (Dynamic Array)
19%
Очередь на связанных списках (Linked List Queue)
58%
Кольцевой буфер (Circular Buffer)
13%
Очередь на массивах (Array Queue)
Golang Дайджест
Какой тип данных используется внутри каналов Go для организации и управления буфером?
Если хотите глубже погрузиться во внутреннее устройство каналов, напомню про видео с полным разбором этой темы

Результаты опроса показали, что этот ролик всё ещё актуален💻
Please open Telegram to view this post
VIEW IN TELEGRAM
Defer your mutex Unlocks

https://www.ribice.ba/defer-mutex-unlocks/

Очень короткая статейка минут на 5 о том, почему нужно вызывать mutex.Unlock() именно в defer

У автора случилась классическая история: у них была функция, окруженная Mutex Lock / Unlock. Она не должна была паниковать, но внезапно делала это. Поэтому до Unlock дело не доходило и мьютекст оставался залоченным.

Наглядней всего проблему демонстрирует код:

defer func() {
if err := recover(); err != nil {
fmt.Println("Recovered") // mutex.Unlock() missed!
}
}()
mutex.Lock()
functionCallThatPanics()
mutex.Unlock()

После фикса:

defer func() {
if err := recover(); err != nil {
fmt.Println("Recovered")
}
}()
m.Lock()
defer m.Unlock() // will be called even after panic
functionCallThatPanics()

————

От себя добавлю: в большинстве случаев лучше использовать Unlock именно в defer. Да, это создает некоторый оверхед по производительности, зато спасает от описанных выше фэйлов. Если у вас нет необходимости тонкой оптимизации, то лучше не рисковать.

Кроме того, это довольно простой случай, а чаще бывает сложнее - когда между Lock / Unlock происходит несколько вызовов, и часть из них могут вернуть ошибку. В таком случае в 99.9% случаев нужно использовать именно defer, иначе вероятность багов многократно вырастает.

#article #english #mutex
От чего зависит скорость разработчика? / GoGetPodcast №9

https://youtu.be/RxkX0NapCDw

Что обсуждается:
- Факторы, которые влияют на скорость работы разработчика
- Цена и вероятность ошибок во время разработки
- Почему Линус так быстро пишет код? Почему Star Citizen никогда не выйдет?
и др.

Состав:
- Николай Тузов
- Глеб Яльчик - тех. директор компании Gaijin
- Даниил Подольский - Microavia.com

————
Go Get Podcast - подкаст про Go и всё что с ним связано

#gogetpodcast #podcast
💻 С чего начать изучать GoLang? - Ультимативный пост

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

Must have, нестареющая классика:

- A Tour of Go - ресурс, с которого 100% надо начинать. Тут вас просто и быстро проведут по всем важным аспектам языка. Прохождение займёт ~4 часа часа, и после этого вы будете знать практически всё, что необходимо
- Effective Go - здесь вас научат не просто писать код, а делать это красиво и эффективно.
- Книга "Язык программирования Go", Донован Алан А. А., Керниган Брайан У - отличная книга, в которой подробно разобрано практически всё, что есть в языке, приведены примеры различных подводных камней и нюансов. Часто в книге объясняется, почему авторы языка сделали именно так, а не иначе. Авторы известные и авторитетные разработчики.

Другие интересные способы начать изучение:

- Go by Example - отличный набор простых и полезных примеров с комментариями
- Learn X in Y minutes – оригинальный и интересный способ изучения языка - вам показывают большой кусок кода с комментариями, который быстро познакомит вас со всеми основами
- Go developer roadmap, о котором я уже писал

Другие ресурсы:

- Николай Тузов - GoLang - YouTube канал с такими же ультимативными уроками по Go ☺️
- Golang Дайджест - ТГ-канал с регулярными подборками материалов по Go
- Go 101 - книга, сосредоточенная на синтаксисе / семантике языка, и на вещах связанных с runtime. Подойдет и новичкам, и опытным разработчикам - для более глубокого понимания.
- How to Write Go Code - пост с рекомендациями по написанию кода от авторов языка
- Go или не Go? от Умпутуна из Radio-T

➡️Но самое главное - не забывайте, что теория это хорошо, но практика важнее. Пишите код, много кода. Только так вы научитесь хорошо писать на Go.

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

#golang #guides #подборки
Please open Telegram to view this post
VIEW IN TELEGRAM
Clean Env - минималистичная библиотека для работы с конфигурацией

https://github.com/ilyakaznacheev/cleanenv

Чаще всего для конфигурации в Go используют spf13/viper, наверняка вы о нём слышали.

Но если вам хочется минималистичности и простоты, Clean Env вам понравится. Тут нет ничего лишнего, а значит легко разобраться, сложно сломать. При этом, всё необходимое тут имеется, в том числе поддержка популярных форматов конфига: yaml, json, toml, env.

Особенно мне понравилась работа с тегами структуры, в которую будет парситься конфиг:

- env-default - дефолтные значения для параметров
- yaml / json / env - имена параметров для парсинге из разных источников
- env-required - отмечает поле как обязательное
- и др.

У Viper не все из этого есть, а для задания имени параметров нужно использовать неочевидный тег - mapstructure.

————
Кстати, если вам вдруг не понравился ни Viper, ни Clean Env, можете посмотреть в сторону koanf, тоже интересный и популярный вариант.

————
💻 Расскажите в комментариях, какими библиотеками для конфигурации вы пользовались, какие вам больше понравились и почему

#package #configuration
Please open Telegram to view this post
VIEW IN TELEGRAM
slog - новый логгер в стандартной библиотеке

В версии Go 1.21 в stdlib будет добавлен пакет для работы с логами - slog. Сейчас его можно попробовать в виде стороннего пакета в golang/x.

Что почитать, чтобы быть в курсе:
- Дискуссия на гитхабе, с которой всё началось
- Анонс дизайн-документа slog
-
Proposal: Structured Logging, который стал результатом дискуссии
- Подробнейший разбор slog - очень советую почитать для понимания мотивации и решения
- Ещё одна статья на эту тему

————
Напомню, чего не хватало в стандартном логгере - log:

- Нет уровней логирования, например - Info, Error, Debug и др. Без этого логи сложнее фильтровать, разделять по важности.
- Нет поддержки structured logs - мы можем выводить только plain text, и не можем использовать формат, который легко парсится разными сервисами (kibana, grafana и т.п.), например - JSON
- Нельзя добавить доп. поля для контекста: userID, traceID и т.п.
и др.

#logs #package #news
Подкаст про GameDev на Go

Искандер Шарипов запустил подкаст про разработку разработку игр на Go. Первый эпизод уже доступен на Mave:

https://gg.mave.digital/ep-1

Приглашённый гость: Андрей Апанасик.

За новостями подкаста можно следить тут.

О чем выпуск:

* 00:00 - Интро, представляем ведущих
* 10:10 - Как Андрей вкатился в геймдев
* 11:50 - Стартап Андрея (balancy.co)
* 17:50 - Маппинг схемы между админкой balancy и игрой
* 19:60 - Визуальная админка в balancy для удобства геймдизайнеров
* 21:50 - Какие движки поддерживает balancy
* 22:20 - Любимые инструменты разработки игр Андрея
* 29:10 - О JSON в Unity
* 30:50 - Стратегия развития Unity
* 35:10 - Сколько монобехов - слишком много?
* 40:10 - CGo в игрушках на Go
* 45:20 - Некоторые плюсы и минусы особенностей Go в геймдеве
* 48:20 - ECS в Go и Unity (и немного про Factorio)
* 1:09:50 - Особенности рендеринга в Ebitengine и многопоточка в играх на Go
* 1:19:50 - Говорим о Nakama (open source game server, написанный на Go)
* 1:26:35 - Сетевой код для игр на Go, headless сборки на Ebitengine и Unity
* 1:32:30 - Платформы, под которые можно собирать игры на Ebitengine
* 1:37:40 - В какие игрушки играет Апанасик

#gamedev #podcast
Давайте обсудим, книги по Go

Расскажите, что вы читали в последнее время, и что из этого вам понравилось? Желательно, чтобы это были свежие и актуальные книги.

А если ещё и напишете комментарий, то коллеги будут вам особенно благодарны: что понравилось / не понравилось, о чем в целом книга, стоит ли обратить на неё внимание, почему стоит?

Про must have "Язык программирования Go" Кернигана не пишем, про него и так все знают ❤️ Да и она уже не очень свежая.

💻 Скидывать электронные копии книг в комментариях нельзя

#discussion #books
Please open Telegram to view this post
VIEW IN TELEGRAM
В каких случаях вы считаете правильным использование именованных значений, возвращаемых функциями, т.е.:

`func myFunc() (x int, y int, z int) { ... }` Можно выбрать несколько вариантов. Также делитесь своим мнение в комментах.
Anonymous Poll
35%
В случае использования возвращаемого значения в defer
37%
Когда без имени непонятно, что именно возвращает функция
12%
Всегда когда есть что возвращать - сэкономим на строчках с объявлением переменных
20%
Никогда, я против этой конструкции!
1%
Свой вариант (напишу в комментах)
24%
Не знаю / Посмотреть ответы
Golang Дайджест
Давайте обсудим, книги по Go Расскажите, что вы читали в последнее время, и что из этого вам понравилось? Желательно, чтобы это были свежие и актуальные книги. А если ещё и напишете комментарий, то коллеги будут вам особенно благодарны: что понравилось /…
Обсудим книги для разработчиков

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

Расскажите, что вы посоветуете почитать Go-разработчикам, помимо литературы по Go?

Как и в прошлый раз, огромный жирный лайк тем, кто не поленится и напишет развернутый комментарий к своей книге / подборке: что понравилось / не понравилось, о чем в целом книга, почему стоит обратить на неё внимание?

💻 Скидывать электронные копии книг в комментариях нельзя

————
p.s. За фото спасибо Алексею Акуловичу ❤️

#discussion #books
Please open Telegram to view this post
VIEW IN TELEGRAM