Подборка лучших статей о языке Go для читателей различного круга интересов и уровня подготовки, на английском и русском языках.
В данной публикации представлен список постов из различных блогов, посвященных языку программирования Go. Этот список включает только самые полезные и релевантные материалы, действительно заслуживающие внимания программистов, уже использующих или только знакомящихся с языком Go. Оригинальный список на английском языке находится на GitHub. Англоязычные посты в подборке мы дополнили имеющимися переводами на русский язык и оригинальными русскоязычными статьями.
Язык программирования Go является одним из языков с наиболее быстрорастущей аудиторией, на что указывает число статей в различных блогах. Если вы считаете, что какие-то из не приведенных ресурсов также заслуживают внимания, присылайте их в комментарии к этой публикации.
Интересуют блоги, статьи и книги по Go? Тогда вы по адресу!
В начале пути
- Зачем учить язык Go? (rus)
- Интерактивный тур по языку Go
- Часто задаваемые вопросы
- Go в примерах | Перевод (rus)
- Учебное пособие по языку Go
- Введение в программирование на Go (rus)
Новичок
Основы
- Golang: основы для начинающих (rus)
- Трюки с использованием срезов
- 5 советов по использованию строк
- Типы данных Struct, Map, Array и Slice
- Понятное объяснение указателей Go менее чем в 800 слов
- Туториал по каналам Go
- Разработка с использованием каналов
- Аксиомы каналов
- Наглядная визуализация структур Go
- Понимание panic-ошибок
- 3 наиболее распространенных ловушки языка Go (rus)
- Как обойти подводные камни
- Основные подводные камни
- 50 оттенков Go: ловушки, подводные камни и распространенные ошибки новичков | Перевод (rus)
- Неофициальный список частых вопросов и ответов
- Лекции Техносферы: Программирование на Go (rus)
Стоит читать снова и снова
- Эффективный Go
- Визуализация конкурентности в Go
- Строки, байты, раны и символы в Go
- Массивы, срезы и строки: механизм добавления
Организация кода и стиль
- Основные комментарии, возникающие при ревью кода
- Командный центр: меньше значит в разы больше
- Пословицы Go
- Идиомы Go
- Структура Errors
- Когда использовать однострочные выражения if...else?
- Элегантная поддержка ошибок
- Эффективная поддержка ошибок
- Главное преимущество Go (rus)
- Альтернативные шаблоны перегрузки методов
- Пять способов создания нового проекта
- Структуризация тестов
- Организация программного кода
- Анатомия проекта на Go
- Стандартный шаблон пакета
- Руководства по стилю для пакетов Go
- Обработка времени в go
- Пустой struct
- Семантика For Range
- Как я перестал беспокоиться и полюбил интерфейсы Go
- Как использовать интерфейсы в Go
Веб
- Создание моего первого веб-приложения при помощи Go
- Создание RESTful JSON API в Go
- How to Serve Static Files with Golang
- Введение в шаблоны Go
- Работая с JSON-объектами в Go
- Создание конкурентных HTTP запросов на языке Go
- Golang http обработчики в качестве межплатформенного интерфейса
- TCP Echo Server на языке Go
- Загрузка и скачивание файла по HTTP
- Пример простого контекстного запроса по HTTP
- Go и JSON
- Написание HTTP промежуточного слоя программного слоя в Go
- Изучение веб-программирования в Go на примерах
Если вы заинтересованы в разработке веб-сервисов на Go, то на Coursera есть соответствующий русскоязычный курс для начинающих.
Конкурентность в языке Go
Средний уровень
Дизайн кода
- Лучшие практики после шести лет работы с Go | Перевод (rus)
- Отличительные особенности хорошей библиотеки на языке Go
- Ссылка с подборкой библиотек
- Пять SOLID-принципов дизайна кода
- О способах улучшения логирования в Go проектах
- Вместо фреймворка используйте std net/http
- Что значит “принимать interface, возвращать struct”
- Go: interface{}, присвоение и изменение типа
- Обеспечение соответствия интерфейса Go на стадии компиляции
- Ловушки значений context и как устранить или смягчить их в Go
- Структурирование приложений
- Промышленный уровень программирования
- Слабая связанность в Go
- Самореферентные функции и дизайн опций
- Функциональные опции для дружелюбных API
- Объектно ориентированное наследование в Go
- Объектно-дезориентированный язык (rus)
Конкурентность
- Паттерны конкурентности
- Остановка горутин
- Способы ограничения одновременного использования ресурсов
- Задание Ctrl+C для отмены в context.Context
- Отмена множества горутин
- Как корректно использовать context.Context в Go 1.7
- Использование контекстов для того, чтобы избежать утечек горутин
- Go: производительность горутин (rus)
- Паттерны конкурентности в Go: пайплайны и отмены
- Туториал: Синхронизация состояния с мьютексами в Go
- Context
- Context и отмена горутин
- Смерть горутин под контролем (rus)
- Танцы с мьютексами Go
- Горутины, каналы и правильный выход
- Буферизованные каналы в Go: советы и рекомендации
- Использование sync.WaitGroup
- Способы создания blockForever
- Профиль мьютекса
- Здоровая конкурентность
- Трассировка горутин
- Шаблоны поддержки ошибок
Тестирование
- Тестирование веб-приложений
- Введение в тестирование на языке Go
- 5 простых приемов для написания тестов
- 5 продвинутых методик тестирования
- Культ Go тестирования
- Интерфейсы и композиции для эффективных юнит-тестов
- Метод тестирования в Go: тестирование JSON HTTP запросов
- Приемочное тестирование веб приложений с cookies
- Тестирование HTTP обработчиков событий
- Тестирование конкурентного кода
- Compile-time проверки в Go
- Юнит-тестирование межинтерфейсного слоя
- Малоизвестные особенности тестов Go
- Нагрузочное тестирование (rus)
Веб
- Развертывание Go в интернете
- Go + Heroku: развертывание web-приложения (rus)
- Полное пособие по таймаутам Go net/http
- HTTP(S) прокси в Go менее чем в 100 строк кода
- Пошаговое руководство по написанию сервиса для Kubernetes
- Как не использовать http-router в Go
- Как писать тесты для обработчика маршрутов в Go
- Краткое введение в поддержку TCP в HTTP-реализации
- Веб-сканер на языке Go
- Если сканирование IPv4 показывает открытые конечные точки net/http/pprof
- HTTP запросы: Contexts и Go
- Использование объектно ориентированных серверов Go
- Поддержка ошибок HTTP запросов
- Неожиданные результаты при десерализации JSON при помощи json.Decoder
- Построение высокопроизводительных API с использованием gRPC и Protocol Buffers
- Реализация UDP и TCP в Go
- Не используйте дефолтный HTTP клиента в продакшене
- Написание клиентского API
- Поиск в HTTP объекте
- Использование функций внутри шаблонов
- Настройка конфигурации приложений Go при помощи TOML
- Написание преобразователя данных без использования ORM
- Организация доступа к базам данных
Инструменты
- Основное об инструментах Go
- Профилирование программ
- Инструменты Go в действии
- Использование Go как скриптового языка в Linux
- Уменьшение накладных расходов для утилит на golang (rus)
Трюки
- 10 вещей, которые вы (возможно) не знаете о языке Go
- Трудные вопросы: хорошо ли вы знаете язык Go?
- Грабли Go: нуб или нинзя?
- Продвинутые трюки в Go
- Подводные камни в вопросе срезов
Диагностика
- Диагностика - документация языка
- Профилирование
- Понимание использования памяти в Go
- Пять вещей, делающих Go быстрее
- Логирование, интерфейсы и аллокации в Go | Перевод (rus)
- Практика сравнительных тестов в Go
Язык
- Go: передача по указателю или передача по значению?
- В Go нет передачи по ссылке
- Функции с переменным числом аргументов
- Скрещивающиеся потоки: признание в любви io.Reader
- Пишем симулятор медленных соединений на Go (rus)
- Типы функций в Go
- Структуры данных в Go
Разное
- О предотвращении утечки ресурсов
- Не откладывайте Close() для файлов с возможностью записи
- Примеры использования io.Pipe в Go
- Уменьшение количества рутинного кода при помощи go generate
- Написание очереди работ в Go
- Очереди заданий
- Работа с файлами
- Чтение файлов — обзор
- Работа с Gzip and Tar
- Байты и строковые пакеты
Продвинутый уровень
Низкоуровневые проблемы
- Архитектура ассемблера Go (rus)
- Планировщик с перехватом работы
- Планировщик Go | Перевод (rus)
- Go Assembly в примерах
- Выравнивание адресов
- Усовершенствование планировщика
- Работа с асинхронным вводом/выводом при помощи netpoller
- Анатомия вызова функций в Go
- Масштабируемый дизайн планировщика
- Отслеживание планировщика
- Ручное управление памятью
- unsafe.Pointer и системные вызовы
- Рассмотрим структуры ваших программ in Go 1.7
- Управление ресурсами системных вызовов с помощью crypto/rand
- Оптимизация abs() для int64 в Go
Производительность
- Эффективность распределения памяти в высокопроизводительных сервисах Go
- Обработка 1 миллиона запросов в минуту c Go | Перевод (rus)
- Написание очень быстрой службы кэша с миллионами записей
- Миллион WebSocket и Go | Оригинал (rus)
- Подборка лучших практик относительно производительности
- Как мы перешли с 30 серверов на 2: Go (rus)
Сборка мусора
- Сборщик мусора в теории и практике
- Как оптимизировать сборку мусора
- Современный подход к сборке мусора (rus)
Конкурентность
- Отладка потенциальных зависаний
- Продвинутые конкурентные шаблоны
- Мультиплексирование каналов для максимизации производительности
- Неблокированные значения и atomic.Value
- Блокировки с учетом состояния
- Введение в теорию взаимодействующих последовательных процессов (rus)
- Распределение памяти при помощи взаимодействующих процессов
- Конкурентность это не параллелизм
- Конкурентные паттерны: Context
- Конкурентные паттерны: время вышло, двигаемся дальше
- Конкурентность, горутины и GOMAXPROCS
- Блокировка в crypto/rand
Кодировка символов
Кодирование и декодирование JSON-объектов
Разное
- Подборка библиотек и фреймворков на языке Go
- Изменяемые строки
- Минималистичные идеальные функции хеширования
- Об опыте разработки, внедрения и развертывания Go API с метриками производительности
- Опыт применения Go в продакшене Яндекса (rus)
- Продвинутая работа с рефелексей в HashiCorp
- Библиотека go-fuzz
- Делаем многопользовательскую игру на Go и WebSocket'ах (rus)
- 30 книг для освоения языка программирования Go (rus)
Комментарии