Golang Юниор
4.88K subscribers
198 photos
7 videos
229 links
Канал для начинающих изучать язык программирования Go. Юниоры или Junior - Вперед.

Контент нашего канала состоит из:
- туториалы
- вопросы с собесов
- тесты на знания Go


@anothertechrock
@viktorreh

Чат: https://t.me/+UA9kQbQdpFxmZGY6
Download Telegram
🌐 Как ускорить API

#инфографика про основные методы улучшения производительности API

💬 Какой из методов вы уже используете? Делитесь в комментариях! 👇

Junior Вакансии Go тут
Dynamic Notification System — это проект на Go, разработанный для создания масштабируемого и гибкого планировщика уведомлений!

Он поддерживает отправку уведомлений через различные каналы, такие как Slack, Email, SMS, Webhook и другие. Система позволяет легко добавлять новые платформы с помощью динамической архитектуры плагинов, не требуя перезапуска приложения.

🔐 Лицензия: MIT

Github

Junior Вакансии Go тут
Linux: эффективная многопроцессорность
Используем Go

Автор:
Олег Цилюрик
Год издания: 2024

#go #linux #ru

Скачать книгу
This media is not supported in your browser
VIEW IN TELEGRAM
Zasper — это IDE, разработанная с нуля для поддержки массового параллелизма!

Она разработана на языке Go для обеспечения высокой параллельности и эффективности использования ресурсов. Zasper отличается низким потреблением памяти и процессора, позволяя работать с большими объемами данных на локальных машинах. Она доступен как в виде приложения Electron, так и как веб-приложение.

🔐 Лицензия: AGPL-3.0

Github

@golangprofi
Профессиональный Go

Автор:
Фриман Адам
Год издания: 2022

#go #ru

Скачать книгу
🤩 Улучшение тестов на Go: почему стоит использовать "if got, want"

Техника проверки if got != want { t.Errorf(...) } в тестах Go — это простой и эффективный способ проверки значений, который полностью соответствует философии языка. Она не требует сторонних библиотек, остаётся прозрачной и легко читаемой, что особенно важно для минималистичного и понятного кода.

Благодаря своей простоте, этот подход легко масштабируется: от проверки одного значения до сложных сценариев с таблицами тестирования. Кроме того, стандартный вывод ошибок в Go обычно достаточно информативен, чтобы быстро понять, что пошло не так.

👀 Подробнее про технику с примерами кода можно почитать тут

Согласны?

Junior Вакансии Go тут
Please open Telegram to view this post
VIEW IN TELEGRAM
📦 Пакет embed в Go

Если вы когда-либо работали с Go, то знаете, как важно уметь управлять статическими ресурсами. Пакет embed (представленный в Go 1.16) решает эту задачу элегантно: он позволяет встраивать файлы прямо в исполняемый бинарный файл, что делает приложение автономным и упрощает его развертывание.

💡 Зачем использовать embed?
С помощью директивы //go:embed вы можете встроить файлы (например, HTML, CSS, конфигурационные файлы или изображения) прямо в бинарный файл. Это исключает необходимость поставлять эти файлы отдельно, и ваши приложения становятся более компактными и безопасными.

🛠 Как это работает?
Вы указываете директиву //go:embed перед переменной.
Используете типы данных string для текстовых файлов, []byte для бинарных данных или embed.FS для работы с целыми директориями.

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

import (
"embed"
"fmt"
)

//go:embed hello.txt
var hello string

func main() {
fmt.Println(hello)
}

В этом примере файл hello.txt встроен в приложение, и его содержимое доступно как строка.

Почему стоит использовать embed?
Удобство развертывания: всё в одном файле — не нужно беспокоиться о поставке отдельных файлов.
Безопасность: встроенные файлы не могут быть изменены после компиляции.
Автономность: ваши приложения не зависят от внешних файлов и легко переносятся между окружениями.

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

Чат с Go вакансиями
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Golang + Gin + Postgres + Docker + gRPC + NGINX

Go + HTMX-шаблон, содержащий все Необходимые Инструменты для создания веб-приложений.

▪️ Github

#golang #htmx #javascript #programming #webdev

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Немного о языке
программирования GO


👉 Golang Юниор | #shorts
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Airo – это инновационный инструмент для Go разработчиков, который упрощает и ускоряет процесс интеграции и позволяет развертывать проекты прямо с локального компьютера на рабочий сервер.

Kubernetes, Platform as a Service (PaaS) и CI/CD - это мощные решения, но иногда они оказываются сложнее, чем требуется вашему проекту. Если вам нравится управлять своим сервером, использование Airo может быть значительно дешевле и обеспечит больший контроль над техническими деталями вашего проекта.

Он предоставляет удобный интерфейс и расширяемые возможности.

▪️ Простота использования: Благодаря интуитивно понятному интерфейсу, начать работать с Airo можно без длительного изучения сложной документации.
▪️ Гибкость и настройка: Инструмент легко адаптируется под специфические требования любого проекта, позволяя интегрировать дополнительные модули и плагины по мере необходимости.
▪️ Оптимизированный код Airo обеспечивает быструю обработку задач, что особенно важно при работе с большими объемами данных или в условиях сжатых сроков разработки.
▪️ По сравнению с аналогичными инструментами, Airo предлагает оптимальное сочетание скорости, удобства и расширяемости, что позволяет разработчикам работать эффективнее и достигать лучших результатов.

git clone https://github.com/yourusername/airo.git
cd airo
make install
airo deploy


▪️ GitHub: https://github.com/bypirob/airo

@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Seabird — интегрированная среда разработки (IDE) для Kubernetes, ориентированная на пользователей GNOME!

🌟 Он предоставляет удобный интерфейс для исследования и управления кластерами Kubernetes. Включает терминал для выполнения команд, мониторинг через логи и метрики, а также редактор ресурсов с удобной справочной информацией по API.

🔐 Лицензия: MPL-2.0

🖥 Github
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Как язык GO начал
набирать популярность?


👉 Golang Юниор | #shorts
Please open Telegram to view this post
VIEW IN TELEGRAM
Язык Go Для Начинающих

Автор:
Максим Жашкевич
Год издания:
2020

#go #ru

Скачать книгу
👣 Высокопроизводительное кэширование с помощью Redis и Go

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

Стандартом де-факто для централизованного кэширования является Redis, но, популярные сегодня библиотеки Go не поддерживают потоковую передачу данных, эффективных с точки зрения памяти.

Вместо этого они предлагают []byte API, с которыми вы взаимодействуете следующим образом:

// В этом коде используется https://github.com/redis/go-redis, но те же
// ограничения действуют для Rueidis и Redigo.
func redisHandler(w http.ResponseWriter, r *http.Request) {
ctx := context.Background()

// Extract key from RequestURI
key := strings.TrimLeft(r.RequestURI, "/")

// Get the value from Redis as a byte slice
val, err := rdb.Get(ctx, key).Bytes()
if err == redis.Nil {
http.Error(w, "Key not found in Redis", http.StatusNotFound)
return
} else if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}

_, err = w.Write(val)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}


Этот паттерн работает хорошо, если вы кэшируете небольшие объекты, но если вы кэшируете объекты размером более 1 кб, []byte-ориентированные API работют не так хорошо.


В протоколе Redis нет ничего такого, что мешало бы создать потоковый API. Поэтому пердставляем redjet, библиотеку Redis, ориентированную на производительность.

С помощью redjet вы можете написать приведенный выше код следующим образом:

func redisHandler(w http.ResponseWriter, r *http.Request) {
ctx := context.Background()

// Извлечение ключа из RequestURI
key := strings.TrimLeft(r.RequestURI, "/")

// Передаем значение непосредственно из Redis в ответ.
_, err := rdb.Command("GET", key).WriteTo(w)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}


Код стал проще и эффективнее.

go get github.com/coder/redjet@latest

▪️Github
▪️Читать дальше
▪️Бенчмарки

@golangprofi
📚Библиотеки и инструменты для создания и отправки электронной почты на GO.

▪️chasquid - SMTP-сервер, написанный на Go.

▪️douceur - CSS-инлайнер для ваших HTML-писем.

▪️email - Надежная и гибкая библиотека работы с электронной почтой на Go.

▪️email-verifier - Библиотека Go для проверки электронной почты без отправки писем.

▪️go-dkim - Библиотека DKIM для подписи и проверки электронной почты.

▪️go-email-normalizer - Библиотека Golang для нормализации электронной почты.

▪️go-email-validator - Модульный валидатор электронной почты для проверки синтаксиса, содержания, smtp и т. д..

▪️go-imap - Библиотека IMAP для клиентов и серверов.

▪️go-mail - Простая библиотека Go для отправки писем на Go.

▪️go-message - Потоковая библиотека для Internet Message Format и почтовых сообщений.

▪️go-premailer - Встраиваемая стилизация для HTML-почты в Go.

▪️go-simple-mail - Очень простой пакет для отправки электронной почты с SMTP Keep Alive и двумя таймаутами: Connect и Send.

▪️Hectane - Легкий SMTP-клиент, предоставляющий API.

▪️hermes - Пакет Golang, генерирующий HTML-письма.

▪️Maddy - Почтовый сервер "все в одном" (SMTP, IMAP, DKIM, DMARC, MTA-STS, DANE).

▪️mailchain - Отправка зашифрованных писем на адреса блокчейна, написанная на Go.

▪️mailgun-go - Библиотека Go для отправки почты с помощью Mailgun API.

▪️MailHog - тестирование электронной почты и SMTP с веб-интерфейсом и API.

▪️Mailpit - Инструмент тестирования электронной почты и SMTP для разработчиков.

▪️mailx - Mailx - это библиотека, которая упрощает отправку электронной почты по SMTP. Она является расширением стандартной библиотеки golang net/smtp.

▪️SendGrid - Go-библиотека SendGrid для отправки электронной почты.

▪️smtp - Машина состояний протокола SMTP-сервера.

▪️smtpmock - Легкий настраиваемый многопоточный тестовый SMTP-сервер. Имитирует любое поведение SMTP в вашей тестовой среде.

▪️truemail-go - Настраиваемый валидатор/верификатор электронной почты на языке Golang. Проверяет почту через Regex, DNS, SMTP и многое другое.

👉 Golang Юниор | #golang
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Enola Holmes

Это усовершенствованная версия утилиты Sherlock и современный CLI-инструмент, написанный на Go, который позволяет находить учетные записи в социальных сетях по имени пользователя.

go install github.com/theyahya/enola/cmd/enola@latest

▪️ Github

👉 Golang Юниор | #golang
Please open Telegram to view this post
VIEW IN TELEGRAM
Подборка книг по Go на русском языке.
Скачивайте и читайте.

Программирование на языке Go
Автор: Саммерфильд Марк

Go. Рецепты программирования
Автор: Аарон Торрес

Black Hat Go
Автор: Том Стил

Облачный Go
Автор: Титмус М. А.

Практический Go
Автор: Амит Саха

Golang для профи
Автор: Михалис Цукалос

#подборка #ru
👣 Задача с подвохом, который связан с изменением поведения циклов, введенным в Go 1.22 (и, соответственно, актуальным для Go 1.24).

Задача: Что выведет следующий код при компиляции и запуске с использованием Go 1.24?


package main

import (
"fmt"
"sync"
"time"
)

func main() {
var wg sync.WaitGroup
count := 3

fmt.Println("Запуск горутин...")
wg.Add(count)

for i := 0; i < count; i++ {
// Запускаем горутину в каждой итерации
go func() {
defer wg.Done()
// Имитируем небольшую работу
time.Sleep(time.Duration(10) * time.Millisecond)
// Используем переменную цикла 'i' внутри горутины
fmt.Printf("Горутина видит i = %d\n", i)
}()
}

fmt.Println("Ожидание завершения горутин...")
wg.Wait()
fmt.Println("Все горутины завершены.")
}



Разбор:
Классическая проблема (до Go 1.22): В версиях Go до 1.22 существовала известная проблема с захватом переменных цикла в замыканиях (функциях, создаваемых внутри цикла, как наша анонимная горутина). Переменная i была одна на весь цикл.

Когда горутины реально начинали выполняться (после небольшой задержки time.Sleep), цикл for, скорее всего, уже завершался. К этому моменту переменная i имела бы свое конечное значение (в данном случае 3, так как цикл завершается, когда i становится равным count).

Поэтому в старых версиях Go этот код, скорее всего, вывел бы:
Запуск горутин...
Ожидание завершения горутин...
Горутина видит i = 3
Горутина видит i = 3
Горутина видит i = 3

Все горутины завершены.

(Порядок строк "Горутина видит..." мог быть разным). Чтобы обойти это, раньше приходилось делать так: i := i внутри цикла перед запуском горутины, чтобы создать копию переменной для каждой итерации.

Новое поведение (Go 1.22 и новее, включая 1.24): Начиная с Go 1.22, семантика переменных цикла for была изменена для предотвращения этой распространенной ошибки. Теперь переменная цикла (i в нашем случае) пересоздается для каждой итерации.

Это означает, что каждая горутина захватывает свою собственную копию i, соответствующую значению на момент этой итерации.

Ожидаемый вывод (Go 1.24): Благодаря изменению в Go 1.22, каждая горутина теперь корректно видит значение i той итерации, в которой она была запущена. Поэтому вывод будет (порядок строк "Горутина видит..." может варьироваться из-за недетерминированного планирования горутин):
Запуск горутин...
Ожидание завершения горутин...
Горутина видит i = 0
Горутина видит i = 1
Горутина видит i = 2
Все горутины завершены.
Use code with caution.
Или, например:
Запуск горутин...
Ожидание завершения горутин...
Горутина видит i = 2
Горутина видит i = 0
Горутина видит i = 1
Все горутины завершены.


Подвох заключается в том, что код выглядит как классический пример ошибки захвата переменной цикла, но из-за изменений в языке начиная с Go 1.22, он теперь работает "правильно" без необходимости явного копирования переменной (i := i).
Please open Telegram to view this post
VIEW IN TELEGRAM
Вакансии для Golang-разработчиков за последние 14 дней:

Go Developer. Удалёнка (РФ, РБ), 70–100 т.р.

Golang Developer. Удалёнка (РФ), 100–140 т.р.

C++/Go-разработчик. Гибрид (Новосибирск)

Golang Developer. Удалёнка (РФ), 150–250 т.р.

Golang Developer. Гибрид (Москва), 200–450 т.р.

Golang разработчик. Гибрид (Москва), ЗП обсуждается

Golang Developer. Гибрид/Офис (Тбилиси), 400–800 т.р.

#подборка #golang #go
👣 Оптимизация выделения памяти в Go: как одна строчка замедлила всё на 30%

В базе данных Dolt (аналог Git, но для SQL-таблиц) после рефакторинга один из бенчмарков (types_scan) внезапно стал работать на 30% медленнее. Причина? Казалось бы, невинная строчка кода.

📉 Что произошло
Метод GetBytes() начал вызывать ReadBytes() у интерфейса ValueStore. Всё выглядело логично, пока не включили профилировщик Go и не обнаружили странную активность:
🔍 runtime.newobject вызывался слишком часто → программа делала много лишних аллокаций в куче.

📦 Где зарыта собака

func (vs nodeStore) ReadBytes(...) ...

Этот метод использовал приёмник по значению (vs nodeStore). Это значит, что вся структура копировалась при каждом вызове метода, даже если она большая.

🚑 Как пофиксили
Просто поменяли на приёмник по указателю:

func (vs *nodeStore) ReadBytes(...) ...

Вуаля — аллокейшны исчезли, производительность восстановилась.

🧠 Вывод
❗️ Методы с приёмником по значению = риск лишнего копирования и аллокаций
🛠 Даже один маленький метод может резко замедлить ваш код
🔍 Профилировка в Go — мощный инструмент. Используй pprof!

Полный разбор в блоге DoltHub
Подробнее про Dolt
Please open Telegram to view this post
VIEW IN TELEGRAM