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

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

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

Обратная связь: @justskiv
Download Telegram
#статья #dyi

Интересная статья о написании "игрушечного" DNS-резолвера. Также автор простым языком даёт необходимый ликбез.

Хороший способ получше разобраться в устройстве DNS и потрогать его своими руками.

https://jvns.ca/blog/2022/02/01/a-dns-resolver-in-80-lines-of-go/
#репозиторий #проект #утилита

Cheat - консольная утилита для создания и просмотра "шпаргалок" для командной строки (написана на Go).
Помогает работать с командами, которые мы часто используем, но недостаточно часто, чтобы запомнить.

Пример:

Нам понадобилось поработать с архивом с помощью tar, пишем:

cheat tar

Получаем:

# To extract an uncompressed archive:
tar -xvf '/path/to/foo.tar'

# To extract a .gz archive:
tar -xzvf '/path/to/foo.tgz'

# To create a .gz archive:
tar -czvf '/path/to/foo.tgz' '/path/to/foo/'

# To extract a .bz2 archive:
tar -xjvf '/path/to/foo.tgz'

# To create a .bz2 archive:
tar -cjvf '/path/to/foo.tgz' '/path/to/foo/'

https://github.com/cheat/cheat
#репозиторий #проект

Коллекция алгоритмов, реализованных на Go в образовательных целях.

Присутствуют как самые простые - поиск максимума с помощью обычного цикла, так и более интересные - реализация хэш-функции sha256.

https://github.com/TheAlgorithms/Go
#статья

Отличная статья о том, что такое пул соединений в MySQL, почему он необходим, и как его правильно настроить для Go-клиента.
Тема описана очень подробно, читается интересно.

В начале присутствует краткий ликбез про клиент-серверный протокол MySQL.

https://habr.com/ru/company/citymobil/blog/583558/
#статья

Как использовать пакет dockertest в Go.

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

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

Сделать это можно, например, с помощью библиотеки dockertest. В статье на наглядном примере демонстрируется, как этим пользоваться.

https://eax.me/golang-dockertest/
#статья #diy #english

Делаем load balancer на Go (Implement a load balancer in Golang)

Как обычно, хороший способ понять, как что-то работает - попробовать сделать это своими руками.
Статья начинается с небольшого ликбеза по балансировщикам, и далее показан пример реализации с подробными пояснениями.

https://dev.to/bmf_san/implement-a-load-balancer-in-golang-8gj
#новость #generics #репозиторий

Дженерики наконец-то вышли, дождались! ❤️

Состоялся релиз Go 1.18, в который они вошли.

В качестве знакомства, предлагаю взглянуть на данный репозиторий. Это библиотека в стиле Lodash (крайне популярной библиотеки "на все случаи жизни" из мира JS).

Конечно, тащить в прод точно не стоит, да и авторы такого не подразумевают. Это просто набор экспериментов с дженериками - очень полезно для ознакомления и практики.
Channel photo updated
#статья

Планировщик Go

Пожалуй
, лучшие статьи про устройство планировщика из всех, что я встречал.

Состоит из двух частей.
Оригинал (англ.): OS Scheduler и Go Scheduler
Перевод: Часть I — Планировщик ОС и Часть II — Планировщик Go

В первой части даются базовые основы планировщика ОС, необходимые для понимания основной темы: потоки, переключение контекста, кэш процессора и др.

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

Местами читается непросто, особенно для новичка, но оно того точно стоит.
#статья #структуры_данных #детали_реализации #тонкости_go

Хэш таблицы в Go. Детали реализации.

Статья начинается с небольшого ликбеза, а дальше самое интересное - подробности реализации Map в Go:

- как осуществляется инициализация, и почему без неё можно получить панику
- как map растёт, и почему порой лучше выделить память заранее (да, так можно поступать не только со слайсами)
- почему нельзя взять адрес значения
- как устроены бакеты
и др.

https://habr.com/ru/post/457728/

——

Кстати, если вы хотите узнать побольше про хэш-таблицы (без привязки к языку), то у меня на канале есть простое и понятное видео об этом: Хэш-таблицы за 10 минут.
#статья #детали_реализации #тонкости_go #slice

Изменения функции append в Go 1.18

Небольшая заметка о том, как поменялась формула увеличения capacity среза при добавлении новых элементов в недавнем релизе Go 1.18.

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

Я бы не назвал это "must have" знанием, но полезно понимать нюансы работы языка под капотом.
Тем более, это статейка на 5-10 минут - можно осилить за чашечкой кофе ☕️

https://habr.com/ru/post/660827/
Не совсем про Go, но для Go-разработчиков это супер-полезная штука.

Поймете на фундаментальном уровне, зачем нужен пакет sync, как с ним работать, и почему без них нельзя позволять нескольким горутинам работать с общим ресурсом.
#game4devs #concurrency

Если вы плохо понимаете проблемы параллельного программирования и конкурентного доступа, очень советую пройти игру - The Deadlock Empire.

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

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

https://deadlockempire.github.io/
#game4devs #sql #database

Игра для практики написания SQL-запросов

Ещё одна игра для разработчиков - SQL Murder Mystery. В этот раз нам предлагают раскрывать преступления путём исследования данных в предоставленной БД. Шикарная идея и крутая реализация.

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

Сложно заставить себя изучать SQL на скучных искусственных примерах из учебников. Плюс этот навык довольно быстро выветривается, когда нет практики.
Но когда появляется интересная цель, процесс идёт намного бодрее. К тому же так лучше усваивается и запоминается.

Кстати, по поводу реализации. Мне не очень понравилось писать запросы в маленьком окошке. К счастью, исходники есть на GitHub. Отсюда можно скачать базу данных игры (файл sql-murder-mystery.db) и исследовать её локально в любом удобном клиенте - это SQLite.
Первый коммит в git-репозиторий Go был сделан в 1972 году Брайаном Керниганом

Первый коммит и правда датируется 1972 годом:

main( ) {
extrn a, b, c;
putchar(a); putchar(b); putchar(c); putchar('!*n');
}
a 'hell';
b 'o, w';
c 'orld';

Следующим идет коммит 1974 года, конвертирующий предыдущий в язык C.

Следующие два в 1988: первый конвертируют код в ANSI C, во втором приезжает мелкий фикс к первому.

После этого Роберт Грейсмер начинает работать над спецификацией Go в 2008.

По этой ссылке можно посмотреть на историю этих коммитов визуально.

Забавно, что сам git официально появился лишь в 2005 году.

Как это возможно? В git вы можете устанавливать дату своего коммита как угодно. Возможно, Брайан (или кто-то другой) таким образом хотел подчеркнуть тот факт, что идеи языка Go зародились в 1972 году. Для сравнения, язык C разрабатывался в 1969—1973 годах.

Источник
Подробный разбор типа Map в Go

Что разбирается в видео:
- Структуры, реализующие Map и их исходный код: заголовок мапы (hmap), структура бакетов, type descriptor и др.
- Операция поиска значения и её исходный код
- Процессы, происходящие в Map: рост мапы, эвакуация данных, переполнение бакета
- Во что преобразуются базовые операции над мапой и как они обходятся без дженериков?

Как результат, мы получаем ответы на важные вопросы:
- Зачем и как заранее аллоцировать под мапу память?
- Почему нельзя взять указатель на элемент мапы?
- Почему порядок обхода мапы случайный?
- Почему при этом вывод fmt.Println(map) фиксированный?
- Как растёт мапа при заполнении?

#video #map #детали_реализации #тонкости_go

https://youtu.be/P_SXTUiA-9Y
История создания Гофера - маскота Golang 💙

На мой взгляд, это самый удачный и популярный маскот IT-технологии.

Интересно, что впервые Гофер был нарисован задолго до создания самого Go.

https://go.dev/blog/gopher

#gopher #mascot #history
Разбор интересных нововведений в Go 1.19

Автор не просто выделил интересные моменты, но и попытался подробно их разжевать, объясняя основную суть и мотивацию авторов.

О чем пойдет речь:

- Область действия типов в объявлениях методов
- Модель памяти
- Новые типы в пакете sync/atomic
- Soft Memory Limit
- Оптимизация
- Прочие минорные изменения

В целом версия 1.19 не внесла каких-то больших и значимых изменений в Go по сравнению с 1.18. В статье опущена часть минорных трансформаций. С их полным списком можно ознакомиться на странице релиза 1.19. Так как официальный релиз намечен на август, можно предположить, что ещё какие-то изменения обязательно появятся.

https://habr.com/ru/company/ozontech/blog/674190/