Учебник Go для начинающих
Go (часто называют Golang) — компилируемый язык со статической типизацией, созданный в Google. Его придумали инженеры, уставшие от долгой компиляции и сложности больших систем на C++ и Java. Идея Go — быть простым настолько, что весь язык умещается в голове, и при этом давать скорость близкую к C, мгновенную компиляцию и встроенную в язык конкурентность.
Этот курс рассчитан на тех, кто уже писал код на другом языке — Python, JavaScript, Java, C# или любом другом. Мы не будем объяснять, что такое переменная или цикл; вместо этого сосредоточимся на том, чем Go отличается: на его минималистичном синтаксисе, явной обработке ошибок, модели конкурентности через горутины и каналы и наборе идиом, которые делают Go-код узнаваемым.
За шесть разделов вы пройдёте путь от первой программы и модулей до структур, интерфейсов, обработки ошибок, горутин с каналами и небольшого HTTP-сервера на стандартной библиотеке. Код во всех примерах компилируемый и идиоматичный. Go в браузере не запускается, поэтому примеры снабжены ожидаемым выводом — повторяйте их локально через go run и сверяйтесь.
Курс «Go» состоит из 6 разделов и 24 уроков: Введение в Go, Основы языка, Структуры данных, Структуры и методы, Обработка ошибок и конкурентность и Практика и инструменты. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Введение в Go
- Чем хорош Go
Почему стоит учить Go: простота из 25 ключевых слов, компиляция в один бинарник, нативная скорость, статическая типизация и встроенная конкурентность.
- Установка и окружение
Как установить Go, проверить версию через go version, зачем нужен (и почему не нужен) GOPATH, какие команды go бывают и как gofmt избавляет от споров о стиле.
- Первая программа
Разбор первой программы на Go: package main, import fmt, func main как точка входа и печать через Println и Printf с глаголами форматирования %s, %d, %v, %T.
- go run, go build и модули
Команды go run и go build, кросс-компиляция через GOOS/GOARCH, создание модуля go mod init, файл go.mod и управление зависимостями через go get и go mod tidy.
- Чем хорош Go
2 Основы языка
- Переменные, типы и константы
Объявление переменных через var и :=, базовые типы Go, нулевые значения, явное преобразование типов и константы с автонумерацией через iota.
- Функции
Функции в Go: синтаксис объявления, несколько возвращаемых значений, идиома value-error, именованные результаты, пустой идентификатор и функции как значения с замыканиями.
- Управление потоком
Управление потоком в Go: if с инициализацией без скобок, единственный цикл for во всех его формах, перебор через for range и switch без проваливания вниз.
- Пакеты и видимость
Как Go организует код в пакеты, правило экспорта через заглавную первую букву вместо public/private, блочные импорты с псевдонимами и документация через комментарии.
- Переменные, типы и константы
3 Структуры данных
- Массивы и срезы
Массивы с фиксированным размером и гибкие срезы в Go: создание, append, len и cap, перевыделение памяти и важная особенность подсрезов, делящих память с исходным.
- Словари (map)
Тип map в Go: создание через make и литерал, добавление и удаление ключей, идиома проверки наличия v, ok и неопределённый порядок обхода.
- Строки и руны
Почему строки в Go — это байты UTF-8, а не символы: разница len и числа символов, руны как кодовые точки Unicode, перебор for range и преобразования []byte и []rune.
- Указатели
Указатели в Go наглядно: операторы & и *, передача по значению против передачи по указателю, nil, отсутствие арифметики указателей и автоматическое разыменование полей структур.
- Массивы и срезы
4 Структуры и методы
- Структуры (struct)
Структуры в Go: объявление полей, способы инициализации по именам и по порядку, печать через %+v и встраивание структур как замена наследованию композицией.
- Методы
Методы в Go: получатель-значение против получателя-указателя, почему value receiver меняет лишь копию, автоматическое взятие адреса и правило единообразия получателей.
- Интерфейсы
Интерфейсы в Go и их неявная реализация: тип подходит, если имеет нужные методы, пустой интерфейс any, type assertion с проверкой ok и type switch.
- Зачем нужны интерфейсы
Практическая ценность интерфейсов в Go: развязка кода через поведение, тестирование подменой реализаций, маленькие интерфейсы вроде io.Reader и правило принимай интерфейсы, возвращай структуры.
- Структуры (struct)
5 Обработка ошибок и конкурентность
- Ошибки как значения
Обработка ошибок в Go без исключений: error как интерфейс, идиома if err != nil, создание ошибок через errors.New и fmt.Errorf, оборачивание %w и ранний возврат.
- defer, panic и recover
Механизмы defer, panic и recover в Go: отложенная уборка ресурсов, порядок LIFO, паника как невосстановимая ситуация и перехват через recover внутри defer.
- Горутины и каналы
Конкурентность в Go: горутины через ключевое слово go, каналы для безопасного обмена данными, операторы отправки и приёма, буферизованные каналы и девиз про общение вместо общей памяти.
- select и sync
Координация горутин в Go: select как switch для каналов с тайм-аутами, sync.WaitGroup для ожидания группы горутин через Add/Done/Wait и sync.Mutex для защиты общей памяти.
- Ошибки как значения
6 Практика и инструменты
- Стандартная библиотека
Обзор стандартной библиотеки Go: пакеты strings и strconv для текста и чисел, time для дат, encoding/json для сериализации с тегами полей.
- Тестирование
Встроенное тестирование Go: пакет testing, файлы *_test.go, функции TestXxx с *testing.T, команда go test, табличные тесты с t.Run и покрытие через go test -cover.
- Пример: HTTP-сервер
Небольшой HTTP-сервер на стандартной библиотеке Go: net/http, HandleFunc и ListenAndServe, JSON API через encoding/json и маршрутизация по HTTP-методам.
- Идиомы Go и что дальше
Ключевые идиомы Go в одном месте: явная обработка ошибок, плоский код, маленькие интерфейсы и каналы, полезные инструменты go vet и race-детектор, и план дальнейшего изучения.
- Стандартная библиотека