Библиотека Go-разработчика | Golang
23.3K subscribers
2.08K photos
42 videos
87 files
4.45K links
Все самое полезное для Go-разработчика в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/32d20779

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a4a8c2468
Download Telegram
#tip #go #beginner

Использование ссылки на переменную итератора цикла

В Go переменная итератора цикла — это единственная переменная, которая принимает разные значения на каждой итерации цикла. Это очень эффективно, но может привести к непреднамеренному поведению при неправильном использовании. Смотрите пример слева, который выдаст неожиданные результаты:

Values: 3 3 3
Addresses: 0x40e020 0x40e020 0x40e020


На каждой итерации мы добавляем адрес i к срезу out, но поскольку это одна и та же переменная, мы добавляем тот же адрес, который в итоге содержит последнее значение, присвоенное i. Одно из решений — скопировать переменную цикла в новую переменную:

for i := 0; i < 3; i++ {
i := i
out = append(out, &i)
}


Новый вывод программы — это то, что ожидалось:

Values: 0 1 2
Addresses: 0x40e024 0x40e028 0x40e032


Строка i := i копирует переменную цикла i в новую переменную, ограниченную блоком тела цикла for, также называемым i. Адрес новой переменной — это тот, который добавляется к массиву. В каждой итерации цикла создается новая переменная.

Хотя этот пример может показаться несколько очевидным, такое же неожиданное поведение может быть более скрытым в некоторых других случаях. Например, переменная цикла может быть массивом, а ссылка может быть срезом (пример справа). В результате получаем:

Values: [[3] [3] [3]]
👍22
Новые каналы по Go🎉

Готовимся к собеседованиям по Go и проверяем себя на практических задачках: «Библиотека программиста» запустила два канала специально для Go-разработчиков и тех, кто хочет ими стать👨‍🏫

Подписывайтесь:
👉Библиотека собеса по Go — тут мы готовимся к интервью
👉Библиотека задач по Go — тут решаем задачи, проходим тесты и изучаем код
👍12😁2
Обзор изменений и нововведений в Go 1.21: взгляд команды МТС

«Зачем читать подобные обзоры» — спросите вы. В первую очередь за тем, что каждый разработчик видит ту или иную фичу языка по-своему, под своим углом. Кто знает, может именно этот обзор покажется вам наиболее интересным. Поэтому читаем и закрепляем знания о новой версии языка.
🔥92👍2🥱1
Несколько недель назад команда Dolt объявила о первой реализации полнотекстовых индексов. Dolt использует специальный SQL-движок, который позволяет управлять версиями базы данных и при этом должен быть высокопроизводительным.

Это также означает, что для полной замены MySQL 8.0 команда Dolt должна реализовать все функции MySQL в движке Dolt. Ну что ж, глобальная цель поставлена, перейдем к реализации полнотекстовых индексов в SQL-движке👇

🔗 Читать
👍63🔥3
#linux #tips

Вместо того, чтобы использовать команду cat для просмотра файлов с исходным кодом, просто используйте Vim команду batcat (bat). Это современная версия cat, которая включает в себя подсветку синтаксиса для многих языков программирования и поддержку Git из коробки.

> alias cat='batcat --style plain'
> alias less='batcat --paging=always --style plain'
21👍16🔥1
Подробный гайд по разработке масштабируемых микросервисов с использованием Go и RabbitMQ

Автор начинает с фундаментльных основ, затем углубляется в особенности использования Go в сочетании с RabbitMQ.

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

🔗 Читать
👍216
🔍Насколько легко «войти в айти»?

IT — перспективная отрасль с высокими зарплатами и огромной конкуренцией. Собираем ваши истории: расскажите, как вам удалось сменить профессию (или сразу найти себя), какие шаги вы для этого предприняли и с какими сложностями пришлось столкнуться.

👉Пройдите наш 10-минутный опрос по ссылке.
5🥱2👍1
☝️📺 Какой сетап у вас дома/на работе (можно выбрать два варианта)?
Anonymous Poll
39%
1
14%
2
43%
3
7%
4
6%
5
2%
6
5%
Другой (напишу в комментарии)
7👍7🥱3
Проектирование отказоустойчивых микросервисов в Go

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

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

«Всегда проектируйте вещи, рассматривая их в следующем более широком контексте: стул в комнате, комната в доме, дом в окружении, среда в плане города» (Элиэль Сааринен)
6👍6
Ищем копирайтера

Нам нужен человек, который:
— Любит IT и русский язык.
— Понимает разницу между бэкендом и фронтендом, OWASP и MISRA, функциональным программированием и ООП, микроконтроллером и миникомпьютером, UX и UI.
— Имеет опыт работы от 1 года.
— Будет плюсом, если вы программируете на каком-нибудь языке на уровне стажера/джуна.

Что нужно делать:
— Готовить подборки, ТОПы книг, ютуб- и телеграм-каналов по языкам программирования.
— Делать расшифровки топовых Ютуб-роликов по теме программирования и оформлять их в виде статей.
— Готовить новостные заметки.
— Актуализировать старые статьи.
— Брать интервью у экспертов. Мы поможем с поиском экспертов.
— Иногда писать небольшие рекламные посты в телеграм.
— Писать статьи с кодом, переводить статьи (по желанию, оплачивается отдельно).

Можно использовать нейронки?
— Да, главное, чтобы материал получился интересный.

Условия:
— Белая зарплата: 50 000 руб.
— Возможность работать удаленно.

👉Присылайте свои резюме: hello@proglib.io
7👍3🥱1
#tip #go

Типичная ситуация: пакет document не должен зависеть от пакета storage, но типу document.Doc нужен способ загрузки и сохранения содержимого.

В Go для создания и DI требуется три шага без каких-либо фреймворков. Примеры псевдокодом👇

1️⃣ Пакет document

Определите интерфейс в пакете document.

type Storage interface {
Load(int) Content <i>// some content type</i>
Save(Content) int
}

Сделайте интерфейсную часть типа Doc, чтобы позже подключить фактическое хранилище.

type Doc struct {
Cont Content
Store *Storage
}

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

func (d *Doc) LoadById(id int, s Storage) {
d.Cont = d.Store.Load(id)
}
<i>// same for Save...</i>

2️⃣ Пакет storage

Определите тип, который реализует интерфейс.

type DBStore struct {
db *database.DB
}
func (d *DBStore) Load(id int) Content {
<i>// ... load content by id</i>
}
<i>// same for Save...</i>

3️⃣ Пакет main

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

App.Doc.Store = storage.NewDBStore(...)
🥱21🔥4👍3😁1🌚1
👀 Структурированное логирование с slog: взгляд команды Go

🔹Экскурсия по slog
🔹Производительность
🔹Проектирование пакета slog (одно из самых крупных дополнений к стандартной библиотеке с момента выпуска Go 1)

🔗 Читать
51
#холивар

🤔Что самое трудное в работе программиста? Правильно, выдумывать имена для переменных.

💬Как вы считаете, насколько важен хороший нейминг для сущностей (функций, переменных и т.д.) в вашем коде? И есть ли у вас или в вашей команде общепринятые правила или лучшие практики, которым вы следуете при нейминге?

Если да, поделитесь опытом👇
gRPC в Go: практическое введение от Олега Козырева, Senior Software Engineer в Avito Tech.

📺Смотреть
👍14🥱4🔥2
Как визуализировать модели GORM с помощью Atlas

Вдогонку к очень холиварному предыдущему посту ловите мини-гайд о том, как использовать новую фичу Atlas, которая позволяет разработчикам быстро создавать визуализации диаграммы «сущность-связь» (или ERD) схем баз данных.

В гайде показано, как эту функцию можно использовать в тандеме с одной из основных возможностей Atlas — «Загрузчиками схем» — для создания визуализаций моделей GORM.

Atlas — это независимый от языка инструмент для управления и миграции схем баз данных с использованием современных принципов DevOps.
👍18🤔1