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

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


@anothertechrock
@viktorreh

Чат: https://t.me/+UA9kQbQdpFxmZGY6
Download 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
🚀 Zinx — легковесный фреймворк для игровых серверов на Golang. В отличие от универсальных решений вроде gRPC, этот фреймворк заточен именно под long-lived соединения с поддержкой маршрутизации сообщений и пула воркеров.

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

🤖 GitHub
This media is not supported in your browser
VIEW IN TELEGRAM
📦 Go-Package-Manager — легкий менеджер пакетов для Go-проектов без go.mod

🚀 Что это такое?

Go-Package-Manager (GPM) — это минималистичный менеджер пакетов для Go, который:
- 📁 копирует зависимости напрямую в папку pkg/
- 🧵 поддерживает установку с GitHub, Gist, Bitbucket и GitLab
- 🔧 позволяет собирать и запускать проект без конфликта с go.mod

🛠 Основные команды:

- gpm get [repo] — загрузка зависимости
- gpm run [main.go] — сборка и запуск проекта
- gpm install — установка всех зависимостей из packages.yaml
- gpm clean — очистка всех пакетов

💡 Пример packages.yaml:

packages:
- github.com/some/package
- gitlab.com/another/dep


🎯 Кому будет полезно?

• Новичкам, которые не хотят сразу погружаться в go mod
• Тем, кто работает над однострочными утилитами или экспериментальными скриптами
• Для старых проектов без модулей или в нестандартных окружениях

🔗 Репозиторий
🚀 Go-Json-Rest — минималистичный фреймворк для JSON API на Go. Этот проект предлагает необычно простой способ создания RESTful API без лишней сложности.

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

🤖 GitHub
Вопрос:

Что будет выведено на экран?


Напишите полный вывод программы и объясни, почему именно так.


package main

import (
"fmt"
"time"
)

type Speaker interface {
Speak() string
}

type Person struct {
name string
}

func (p Person) Speak() string {
return "Hi, I'm " + p.name
}

func main() {
var s Speaker
p := Person{name: "Alice"}
s = p

p.name = "Bob"

fmt.Println(s.Speak()) // (1)

func() {
s := p // shadowing: s — это теперь Person, а не Speaker
fmt.Println(s.Speak()) // (2)
}()
go func(p Person) {
time.Sleep(10 * time.Millisecond)
fmt.Println(p.Speak()) // (3)
}(p)

p.name = "Charlie"

time.Sleep(20 * time.Millisecond)
}


💡Подсказки:
Что происходит с интерфейсами в Go при присвоении структур?

Что такое shadowing и как это влияет на s внутри анонимной функции?

Как работает передача аргументов в goroutine?

Как изменения структуры после передачи влияют на уже переданные значения?



Ответ:

Hi, I'm Alice
Hi, I'm Bob
Hi, I'm Bob
Media is too big
VIEW IN TELEGRAM
🖥Увлекательная история создания и развития Go

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

1. Зачатки идеи (2007)

- Место и время: Google, 2007 год
- Инициаторы: Роберт Гриземер, Роб Пайк и Кен Томпсон
- Мотивация:
- Устранить избыточную сложность C++ и Java
- Сохранить статическую типизацию и скорость компиляции
- Сделать параллелизм «из коробки» через модель CSP (Communicating Sequential Processes)

2. Первый публичный релиз (2009)

- 10 ноября 2009
- Запуск официального сайта [golang.org]
- Публикация открытого исходного кода
- Появление интерактивного «Tour of Go» для знакомства с основами языка

3. Go 1.0 — стабилизация и гарантия совместимости (2012)

- 28 марта 2012
- Выход Go 1.0 с обещанием: любая программа, скомпилированная под Go 1.0, будет работать без изменений во всех версиях Go 1.x
- Это решение укрепило доверие сообщества и заложило фундамент для расширения экосистемы

4. Ключевые промежуточные релизы

- Go 1.1 (13 мая 2013)
- Оптимизации компиляции и улучшения runtime
- Go 1.5 (19 августа 2015)
- Полный перенос компилятора и инструментов на Go (убрана зависимость от C)
- Существенно улучшен сборщик мусора
- Go 1.6 (17 февраля 2016)
- Ускорение стандартной библиотеки и улучшенные средства отладки

5. Gopher — талисман и бренд

- 2009: дизайнер Рене Френч создаёт милого Gopher-грызуна
- Ноябрь 2016: выпуск фирменных шрифтов Go и Go Mono
- Апрель 2018: обновлён логотип, подчёркивающий динамику и простоту

6. Система модулей (Go 1.11–1.13)

- Go 1.11 (август 2018): официальная поддержка модулей для управления зависимостями
- Go 1.13 (середина 2019): модули становятся режимом по умолчанию, заменяя устаревший GOPATH

7. Появление обобщённостей (generics) в Go 1.18

- 15 марта 2022
- Введение Generics — долгожданной возможности писать типобезопасный и переиспользуемый код
- Встроенные инструменты для фуззинга
- Новый режим workspace для одновременной работы над несколькими модулями

8. Современное состояние (Go 1.24 и далее)

- Апрель 2025: выход Go 1.24 с новыми оптимизациями компилятора, улучшениями runtime и расширенными инструментами профилирования
- Применение: Docker, Kubernetes, микросервисные архитектуры, высоконагруженные системы
- Сообщество: десятки тысяч публикаций, конференций GopherCon по всему миру, активная разработка экосистемы

> Go прошёл путь от внутреннего эксперимента Google до одного из самых популярных языков для инфраструктурного и высокопроизводительного ПО. Его главные преимущества — лаконичность, надёжность и встроенный параллелизм — делают Go незаменимым инструментом в эпоху многопроцессорных систем.

https://youtube.com/shorts/-lkVgKwrPM4?feature=share
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Reload — это библиотека для Go, разработанная для автоматического обновления ассетов веб-сервера, таких как HTML, CSS и JavaScript, без необходимости вручную перезагружать страницу!

🌟 Она отслеживает изменения файлов на сервере и автоматически передаёт обновления в браузер с помощью WebSocket. Это значительно упрощает процесс разработки веб-приложений, особенно для динамических проектов с частыми изменениями интерфейса.

🌟 Библиотека интегрируется с различными фреймворками Go, используя middleware, и поддерживает управление кэшированием через заголовки Cache-Control. Простота настройки делает Reload удобным инструментом для ускорения разработки и тестирования. Она идеально подходит для разработчиков, которые хотят минимизировать рутинные задачи и сосредоточиться на создании функционального и качественного кода.

🔐 Лицензия: MIT

🖥 Github
Please open Telegram to view this post
VIEW IN TELEGRAM
Вакансии для Golang-разработчиков за последние 14 дней:

Junior Golang Developer. Удалёнка, 75–100 т.р.

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

Go Developer. Удалёнка

Программист FullStack/Java script/Go. Удалёнка, 2000$–4000$

Go Developer. Удалёнка

Senior Go Developer. Офис/Удалёнка (Москва), 350–400 т.р.

#подборка #golang #go
🐿 go-json - незаметный ускоритель JSON для Go. Библиотека предлагает глубокую оптимизацию под капотом, сохраняющая полную совместимость с родным пакетом.

Разрабы смогли реализовать в проекте виртуальную машину с системой opcode-инструкций. В результате скорость обработки JSON возросла в разы, а память используется так бережно, что даже reflect-вызовы перестают быть bottleneck.

🤖 GitHub
👣 Проект: GoVisual


🧩 Что это такое

GoVisual — это инструмент с нулевой конфигурацией, написанный на Go, предназначенный для *визуализации и отладки HTTP-запросов* во время локальной разработки Go-приложений.


🚀 Ключевые возможности

• Визуализирует все входящие HTTP-запросы
• Показывает структуру и содержимое запросов в реальном времени
• Не требует дополнительной конфигурации
• Легко интегрируется в существующие Go-проекты
• Работает локально и предназначен для отладки

⚙️ Как это работает

1. Подключается к вашему HTTP-серверу в Go
2. Перехватывает и отображает все запросы, поступающие на сервер
3. Автоматически запускает веб-интерфейс для отображения логов

🎯 Когда использовать

GoVisual идеально подойдёт, если:

• Вы разрабатываете API или веб-сервер на Go
• Хотите смотреть каждый HTTP-запрос без Postman или стороннего прокси
• Нужна отладка без лишней настройки
• Хотите встроить простой мониторинг в локальную разработку
• Работает «из коробки»

go get github.com/doganarif/govisual

📦 GitHub
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️ Avo — это библиотека и CLI-инструменты, которые позволяют писать ассемблерный код прямо на Go-коде и автоматически генерировать `.s`-файлы + Go-стабы* для вызова этих функций.

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

Вместо управления регистрами вручную, вы описываете логику на Go-подобном синтаксисе а Avo генерирует оптимизированный ассемблерный код с правильными префиксами.

Проект особенно полезен для криптографии и низкоуровневых оптимизаций.

asm.go:


package main
import . "github.com/mmcloughlin/avo/build"

func main() {
TEXT("Add", NOSPLIT, "func(x, y uint64) uint64")
x := Load(Param("x"), GP64())
y := Load(Param("y"), GP64())
ADDQ(x, y)
Store(y, ReturnIndex(0))
RET()
Generate()
}



*Go-стабы: это Go-файл, который объявляет функцию без реализации, но с правильной сигнатурой, чтобы компилятор понимал, как с ней работать.

▪️ GitHub
Лето больших возможностей 💫

ИТ-лагерь Т1 — бесплатный интенсив по погружению в профессию для студентов вузов по техническим и ИТ-направлениям. Можно участвовать даже без опыта и из любого города РФ!

Тебя ждет:
— бесплатное онлайн-обучение
— командная работа над проектом при поддержке опытных менторов
— актуальные навыки для работы в бигтехе
— очное финальное соревнование в атмосфере летнего лагеря

🎓Лучших участников ждет собеседование на оплачиваемую стажировку в Т1 — одну из крупнейших ИТ-компаний России!

Выбирай направление:
🔹 тестирование
🔹 системный анализ
🔹 разработка frontend (JS+React)
🔹 разработка backend (Java)
🔹 прикладное администрирование (старт в DevOps)

📆 Подавай заявку до 29 июня — начни карьеру с ИТ-лагеря Т1!

Информация о рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM