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

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


@anothertechrock
@viktorreh

Чат: https://t.me/+UA9kQbQdpFxmZGY6
Download 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
🚀 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