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

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

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

Обратная связь: @justskiv
Download Telegram
Как лучше передавать структуру User в Save() - по значению или по указателю?
И расскажите, пожалуйста, в комментариях, почему считаете именно так?

(постом ниже будет опрос)

type User struct {
Name string
Age int
// ... 2-5 other fields
}

// SaveUser doesn't change user's state
func Save(u User) error {
// ... save user to
somewhere
}
Признаки злоупотребления интерфейсами (Interface Pollution)

https://www.ardanlabs.com/blog/2016/10/avoid-interface-pollution.html

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

Основная суть статьи заключается в этом кратком списке признаков (smell list) нежелательного использования интерфейсов:

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

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

#english #interfaces #ardanlabs #cleancode
Разработка игры на Go в прямом эфире

Сегодня в 15:00 по мск (уже через 10 минут) Искандер Шарипов планирует запустить стрим, на котором напишет с нуля небольшую игру на Go.

Стрим будет на этом канале: https://www.twitch.tv/quasilyte

#анонс #gogamedev
Golang-Senior-Developer-Interview - Sheet1-1.pdf
41.8 KB
Новая версия опросника Даниила Подольского

Скорее всего, вы уже знакомы с первой версией, опубликованной на Хабре 2 года назад.

Сейчас у Даниила появился новый вариант, он: "более go-специфичный, но он пока недостаточно проверенный - маловато собесов провел по нему"

Прикладываю к посту pdf вариант, для удобства. Но лучше смотреть по ссылке в Google Docs, т.к. наверняка будет обновляться.
GoGetPodcast #7: Что должен знать и уметь Go-разработчик?

Трансляция будет на моём канале.
Когда: 04.02 (уже завтра), в 12:00 по Мск

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

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

P.S. Да. запись обязательно будет ☕️

#gogetpodcast #анонс
Please open Telegram to view this post
VIEW IN TELEGRAM
GoGetPodcast #7: Что должен знать и уметь Go-разработчик?

Выпуск в хорошем качестве уже доступен на YouTube и других площадках. Если что-то не расслышали на трансляции, в записи всё будет ок.

Страничка на основном сайте подкаста

Ссылки:
- Mave - тут также есть список экзотических платформ, на которых можно послушать подкаст
- YouTube
- Apple Podcasts (iTunes)
- Google Podcasts
- Яндекс Музыка
- VK

#gogetpodcast
Какой функцией вы проверяете отсутствие ошибки в тестах, когда используете `stretchr/testify`?

Аргументирование своего варианта в комментариях приветствуется
Anonymous Poll
54%
NoError(t, err)
8%
Nil(t, err)
2%
Другой способ (напишу в комментах)
12%
Не использую testify
24%
Посмотреть ответы / не пишу на Go / Не пишу тесты
Bittorrent клиент с нуля на Go

https://blog.jse.li/posts/torrent/
Есть перевод перевод

💙 Моя любимая рубрика: делаем своими руками

Статья написана хорошо - читается интересно, все понятно, все по делу, без воды.

Как полагается, автор начинает с краткого вводного ликбеза:
- что такое BitTorrent и одноранговые сети
- как устроен протокол BitTorrent
- какая структура у torrent-файла (Bencode), как его парсить
- почему все это так устроено
И т.п.

Ну и самое главное - практическая реализация на Go

Я по прежнему считаю, что лучший способ в чем-то разобраться - сделать это своими руками. А изучение технологии BitTorrent, это хороший способ расширить область своих знаний.

#article #dyi #bittorrent
Сколько ты зарабатываешь? 😄
Опрос анонимный, интересуют только 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%
Другое, напишу в комментах
26%
Не знаю / посмотреть ответы
Какой тип данных используется внутри каналов 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