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

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

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

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

РКН: https://gosuslugi.ru/snet/67a4a8c2468
Download Telegram
Мы можем использовать цикл for-range для моделирования циклов for i in 0..N в некоторых других языках, как показано на примере выше.

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

#tip #go #beginner
🌚14👍1131
#tip #go #beginner

💡 Указатели на массивы могут использоваться как массивы в нескольких ситуациях

📌 Пример слева компилируется и работает нормально, тогда как в примере справа третий for вызывает панику.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7😁43🌚2
#tip #go #beginner

О случайном порядке итерации типа map

Встроенные мапы Go не поддерживают порядок входных значений. Поэтому при использовании цикла for-range для итерации записей мапы порядок записей рандомизируется. Запустив код из примера, вы увидите, что результаты могут отличаться.

Но обратите внимание, что функции вывода на экран в стандартном пакете fmt сортируют записи (по ключам) мапы. То же самое происходит с выводами вызовов функции json.Marshal.
👍25
#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
#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
#tip #go #security

Два способа проверить свой код на наличие уязвимостей

📌Инструмент govulncheck, безусловно, является универсальным для сканирования репозиториев на наличие известных уязвимостей.

🔸Инструмент использует официальную базу данных уязвимостей Go vuln.go.dev, всеобъемлющий источник известных уязвимостей в общедоступных модулях Go.

🔸Govulncheck можно использовать в командной строке или как часть рабочего процесса CI.

📌Еще одним инструментом, заслуживающим внимания, является gosec: Golang Security Checker.

🔸gosec — CLI-инструмент, который может быть интегрирован в пайплайн CI. В дополнение к этому, gosec входит в состав golangci-lint.

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

🔸В отличие от govulncheck, gosec не проверяет наличие известных уязвимостей в общедоступном коде Go. Скорее, он проверяет код на соответствие списку уязвимых шаблонов программирования, включая: жестко закодированные учетные данные, непроверенные ошибки, построение SQL-инструкций с использованием fmt и т.д.
👍6🔥1
💡gRPC и Go на практике

🤩Вы, вероятно, слышали о gRPC, если еще не использовали её. Она особенно популярна для межсервисной связи благодаря своей эффективности, языковой независимости и встроенной поддержке таких вещей, как MTLS.

☝️Выше представлен простой пример начала работы с gRPC от Matt Boyle.

#go #tip
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍5
💡 Одной из идиоматических практик Go является концепция

return early, return often


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

Это делает код более читабельным и простым в сопровождении.

#go #tip by Matt Boyle
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍50🔥3💯21
💡 Добавляем иконку для исполняемого файла Windows, созданного на Go:

1️⃣Готовим иконку

$ magick convert icon.png -define icon:auto-resize=256,128,64,48,32,16 icon.ico

$ convert icon_16.png icon_32.png icon_48.png icon_256.png -colors 256 icon.ico

2️⃣Создаем файлы .syso

$ go install github.com/akavel/rsrc@latest

$ rsrc -arch 386 -ico icon.ico
$ rsrc -arch amd64 -ico icon.ico

3️⃣Go автоматически выберет любой соответствующий файл .syso в каталоге пакета main и включит его в исполняемый файл, созданный для Windows

👉 Подробнее

#go #tip
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🤔4🔥2
Совет на 2025-й — будьте осторожнее с выбором работы.

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

Знакомо? Открываешь вакансию, а там: «Ищем middle-разработчика с опытом 10 лет, знанием 15 языков и готовностью работать за печеньки. Офис в Челябинске, релокация за ваш счет» 🤦‍♂️

Чтобы не тратить время на сотни сомнительных предложений, подпишитесь на IT Job Hub. Там мы отфильтровываем весь мусор и публикуем только избранные вакансии в стабильных компаниях:

— Зарплаты на уровне рынка, а не на уровне голодного студента
— Никаких «мы молодая и дружная семья» — только адекватные условия
— Проверенные работодатели, а не стартапы из сомнительных сфер

Вакансии удобно разбиты по тегам: #python #java #go #data #devops и по другим направлениям. Без воды и лишнего спама — только проверенные вакансии в знакомых компаниях.

Подписывайтесь, если не хотите упустить работу мечты → @proglib_jobs
👍1
🚀 Как ВКонтакте переобучает сотрудников на Go

ВКонтакте запустила масштабную технологическую трансформацию: соцсеть переходит на сервисную архитектуру с использованием Go.

Почему это важно?
Go отлично подходит для высоконагруженных распределённых систем
— Простота синтаксиса и встроенный параллелизм
— Подходит для микросервисов

🔄 В компании сделали ставку на своих разработчиков: уже более 140 специалистов прошли внутреннюю программу переобучения с PHP на Go.

💡 Результат: плавный вход в новые архитектурные подходы, но с большей уверенностью и профессионализмом. Это не только смена языка, но и изменение майндсета — больше самостоятельности в принятии технических решений.

А вы бы согласились пройти переобучение на Go?

🐸 Библиотека Go-разработчика
#кейсы #go
👍34🥱25😢3🤔1