Подборка книг по Go на русском языке.
Скачивайте и читайте.
Программирование на языке Go
Автор: Саммерфильд Марк
Go. Рецепты программирования
Автор: Аарон Торрес
Black Hat Go
Автор: Том Стил
Облачный Go
Автор: Титмус М. А.
Практический Go
Автор: Амит Саха
Golang для профи
Автор: Михалис Цукалос
#подборка #ru
Скачивайте и читайте.
Программирование на языке Go
Автор: Саммерфильд Марк
Go. Рецепты программирования
Автор: Аарон Торрес
Black Hat Go
Автор: Том Стил
Облачный Go
Автор: Титмус М. А.
Практический Go
Автор: Амит Саха
Golang для профи
Автор: Михалис Цукалос
#подборка #ru
Задача: Что выведет следующий код при компиляции и запуске с использованием 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("Все горутины завершены.")
}
Разбор:
Когда горутины реально начинали выполняться (после небольшой задержки 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 Developer. Удалёнка (РФ, РБ), 70–100 т.р.
✓ Golang Developer. Удалёнка (РФ), 100–140 т.р.
✓ C++/Go-разработчик. Гибрид (Новосибирск)
✓ Golang Developer. Удалёнка (РФ), 150–250 т.р.
✓ Golang Developer. Гибрид (Москва), 200–450 т.р.
✓ Golang разработчик. Гибрид (Москва), ЗП обсуждается
✓ Golang Developer. Гибрид/Офис (Тбилиси), 400–800 т.р.
#подборка #golang #go
В базе данных 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
Проект изначально создавался как обучающий — его документация буквально ведёт разработчика шаг за шагом от простого эхо-сервера до полноценного кластера. Сейчас Zinx используют в продакшене, включая китайские игровые студии.
🤖 GitHub
This media is not supported in your browser
VIEW IN TELEGRAM
📦 Go-Package-Manager — легкий менеджер пакетов для Go-проектов без go.mod
🚀 Что это такое?
Go-Package-Manager (GPM) — это минималистичный менеджер пакетов для Go, который:
- 📁 копирует зависимости напрямую в папку
- 🧵 поддерживает установку с GitHub, Gist, Bitbucket и GitLab
- 🔧 позволяет собирать и запускать проект без конфликта с
🛠 Основные команды:
-
-
-
-
💡 Пример
🎯 Кому будет полезно?
• Новичкам, которые не хотят сразу погружаться в
• Тем, кто работает над однострочными утилитами или экспериментальными скриптами
• Для старых проектов без модулей или в нестандартных окружениях
🔗 Репозиторий
🚀 Что это такое?
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
В отличие от тяжёлых фреймворков, он работает как тонкая прослойка над стандартным net/http, добавляя лишь необходимое. Также инструмент имеет архитектуру с middleware-стеком, с помощью которой можно гибко добавлять функциональность вроде CORS или авторизации, сохраняя минимализм кода.
🤖 GitHub
❓Вопрос:
Что будет выведено на экран?
Напишите полный вывод программы и объясни, почему именно так.
💡Подсказки:
Что происходит с интерфейсами в Go при присвоении структур?
Что такое shadowing и как это влияет на s внутри анонимной функции?
Как работает передача аргументов в goroutine?
Как изменения структуры после передачи влияют на уже переданные значения?
✅ Ответ:
Hi, I'm Alice
Hi, I'm Bob
Hi, I'm Bob
Что будет выведено на экран?
Напишите полный вывод программы и объясни, почему именно так.
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)
}
💡Подсказки:
Что такое shadowing и как это влияет на s внутри анонимной функции?
Как работает передача аргументов в goroutine?
Как изменения структуры после передачи влияют на уже переданные значения?
✅ Ответ:
Hi, I'm Bob
Hi, I'm Bob
Media is too big
VIEW IN TELEGRAM
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
Cache-Control
. Простота настройки делает Reload удобным инструментом для ускорения разработки и тестирования. Она идеально подходит для разработчиков, которые хотят минимизировать рутинные задачи и сосредоточиться на создании функционального и качественного кода.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
✓ 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
Разрабы смогли реализовать в проекте виртуальную машину с системой opcode-инструкций. В результате скорость обработки JSON возросла в разы, а память используется так бережно, что даже reflect-вызовы перестают быть bottleneck.
🤖 GitHub
🧩 Что это такое
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
⚡️ Avo — это библиотека и CLI-инструменты, которые позволяют писать ассемблерный код прямо на Go-коде и автоматически генерировать `.s`-файлы + Go-стабы* для вызова этих функций.
Этот необычный инструмент превращает написание высокопроизводительного ассемблера x86 в процесс, похожий на обычную Go-разработку.
Вместо управления регистрами вручную, вы описываете логику на Go-подобном синтаксисе а Avo генерирует оптимизированный ассемблерный код с правильными префиксами.
Проект особенно полезен для криптографии и низкоуровневых оптимизаций.
asm.go:
*Go-стабы: это Go-файл, который объявляет функцию без реализации, но с правильной сигнатурой, чтобы компилятор понимал, как с ней работать.
▪️ GitHub
Этот необычный инструмент превращает написание высокопроизводительного ассемблера 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!
Информация о рекламодателе.
ИТ-лагерь Т1 — бесплатный интенсив по погружению в профессию для студентов вузов по техническим и ИТ-направлениям. Можно участвовать даже без опыта и из любого города РФ!
Тебя ждет:
— бесплатное онлайн-обучение
— командная работа над проектом при поддержке опытных менторов
— актуальные навыки для работы в бигтехе
— очное финальное соревнование в атмосфере летнего лагеря
🎓Лучших участников ждет собеседование на оплачиваемую стажировку в Т1 — одну из крупнейших ИТ-компаний России!
Выбирай направление:
Информация о рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
GoPilot — это библиотека для Go, которая позволяет вызывать ваши функции с помощью естественного языка.
⚡️ С её помощью можно:
- Анализировать запросы на естественном языке
- Автоматически выбирать нужную функцию
- Преобразовывать динамические параметры в строго типизированные структуры
- Проверять обязательные поля и валидировать входные данные
- Управлять порядком выполнения и ответами
## Ключевые особенности
- Natural Language Processing
Обработка запросов пользователя без ручного парсинга текста.
- Automatic Function Routing
GoPilot сам сопоставляет запрос с зарегистрированной функцией.
- Type-Safe Parameter Mapping
Динамические вводимые данные конвертируются в структуры Go.
- Built-in Validation
Генерируемая схема параметров учитывает теги
required
, description
и др. - Easy Integration
Простое API: регистрируете функции и задаёте системный промпт.
- Flexible Response Handling
Поддержка разных форматов ответа и «режимов» выполнения.
## Быстрый старт
import (
"context"
"github.com/SadikSunbul/gopilot"
"github.com/SadikSunbul/gopilot/clients"
"github.com/SadikSunbul/gopilot/pkg/generator"
)
type WeatherParams struct {
City string `json:"city" description:"City name" required:"true"`
}
type WeatherResponse struct {
City string `json:"city"`
Temp int `json:"temp"`
Condition string `json:"condition"`
}
func GetWeather(p WeatherParams) (WeatherResponse, error) {
return WeatherResponse{City: p.City, Temp: 25, Condition: "sunny"}, nil
}
func main() {
client, _ := clients.NewGeminiClient(context.Background(), "API_KEY", "gemini-2.0-flash")
gp, _ := gopilot.NewGopilot(client)
weatherFn := &gopilot.Function[WeatherParams, WeatherResponse]{
Name: "weather-agent",
Description: "Get weather by city",
Parameters: generator.GenerateParameterSchema(WeatherParams{}),
Execute: GetWeather,
}
gp.FunctionRegister(weatherFn)
gp.SetSystemPrompt(nil)
// Генерация + выполнение за один вызов
result, _ := gp.GenerateAndExecute("Какая погода в Москве?")
fmt.Printf("%+v\n", result)
}
▪️ Github
Please open Telegram to view this post
VIEW IN TELEGRAM