Языки программирования

Учебник Go для начинающих

24 урока · 6 разделов · бесплатно, без регистрации

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

Этот курс рассчитан на тех, кто уже писал код на другом языке — Python, JavaScript, Java, C# или любом другом. Мы не будем объяснять, что такое переменная или цикл; вместо этого сосредоточимся на том, чем Go отличается: на его минималистичном синтаксисе, явной обработке ошибок, модели конкурентности через горутины и каналы и наборе идиом, которые делают Go-код узнаваемым.

За шесть разделов вы пройдёте путь от первой программы и модулей до структур, интерфейсов, обработки ошибок, горутин с каналами и небольшого HTTP-сервера на стандартной библиотеке. Код во всех примерах компилируемый и идиоматичный. Go в браузере не запускается, поэтому примеры снабжены ожидаемым выводом — повторяйте их локально через go run и сверяйтесь.

Курс «Go» состоит из 6 разделов и 24 уроков: Введение в Go, Основы языка, Структуры данных, Структуры и методы, Обработка ошибок и конкурентность и Практика и инструменты. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.

Программа курса

  1. 1 Введение в Go

    1. Чем хорош Go

      Почему стоит учить Go: простота из 25 ключевых слов, компиляция в один бинарник, нативная скорость, статическая типизация и встроенная конкурентность.

    2. Установка и окружение

      Как установить Go, проверить версию через go version, зачем нужен (и почему не нужен) GOPATH, какие команды go бывают и как gofmt избавляет от споров о стиле.

    3. Первая программа

      Разбор первой программы на Go: package main, import fmt, func main как точка входа и печать через Println и Printf с глаголами форматирования %s, %d, %v, %T.

    4. go run, go build и модули

      Команды go run и go build, кросс-компиляция через GOOS/GOARCH, создание модуля go mod init, файл go.mod и управление зависимостями через go get и go mod tidy.

  2. 2 Основы языка

    1. Переменные, типы и константы

      Объявление переменных через var и :=, базовые типы Go, нулевые значения, явное преобразование типов и константы с автонумерацией через iota.

    2. Функции

      Функции в Go: синтаксис объявления, несколько возвращаемых значений, идиома value-error, именованные результаты, пустой идентификатор и функции как значения с замыканиями.

    3. Управление потоком

      Управление потоком в Go: if с инициализацией без скобок, единственный цикл for во всех его формах, перебор через for range и switch без проваливания вниз.

    4. Пакеты и видимость

      Как Go организует код в пакеты, правило экспорта через заглавную первую букву вместо public/private, блочные импорты с псевдонимами и документация через комментарии.

  3. 3 Структуры данных

    1. Массивы и срезы

      Массивы с фиксированным размером и гибкие срезы в Go: создание, append, len и cap, перевыделение памяти и важная особенность подсрезов, делящих память с исходным.

    2. Словари (map)

      Тип map в Go: создание через make и литерал, добавление и удаление ключей, идиома проверки наличия v, ok и неопределённый порядок обхода.

    3. Строки и руны

      Почему строки в Go — это байты UTF-8, а не символы: разница len и числа символов, руны как кодовые точки Unicode, перебор for range и преобразования []byte и []rune.

    4. Указатели

      Указатели в Go наглядно: операторы & и *, передача по значению против передачи по указателю, nil, отсутствие арифметики указателей и автоматическое разыменование полей структур.

  4. 4 Структуры и методы

    1. Структуры (struct)

      Структуры в Go: объявление полей, способы инициализации по именам и по порядку, печать через %+v и встраивание структур как замена наследованию композицией.

    2. Методы

      Методы в Go: получатель-значение против получателя-указателя, почему value receiver меняет лишь копию, автоматическое взятие адреса и правило единообразия получателей.

    3. Интерфейсы

      Интерфейсы в Go и их неявная реализация: тип подходит, если имеет нужные методы, пустой интерфейс any, type assertion с проверкой ok и type switch.

    4. Зачем нужны интерфейсы

      Практическая ценность интерфейсов в Go: развязка кода через поведение, тестирование подменой реализаций, маленькие интерфейсы вроде io.Reader и правило принимай интерфейсы, возвращай структуры.

  5. 5 Обработка ошибок и конкурентность

    1. Ошибки как значения

      Обработка ошибок в Go без исключений: error как интерфейс, идиома if err != nil, создание ошибок через errors.New и fmt.Errorf, оборачивание %w и ранний возврат.

    2. defer, panic и recover

      Механизмы defer, panic и recover в Go: отложенная уборка ресурсов, порядок LIFO, паника как невосстановимая ситуация и перехват через recover внутри defer.

    3. Горутины и каналы

      Конкурентность в Go: горутины через ключевое слово go, каналы для безопасного обмена данными, операторы отправки и приёма, буферизованные каналы и девиз про общение вместо общей памяти.

    4. select и sync

      Координация горутин в Go: select как switch для каналов с тайм-аутами, sync.WaitGroup для ожидания группы горутин через Add/Done/Wait и sync.Mutex для защиты общей памяти.

  6. 6 Практика и инструменты

    1. Стандартная библиотека

      Обзор стандартной библиотеки Go: пакеты strings и strconv для текста и чисел, time для дат, encoding/json для сериализации с тегами полей.

    2. Тестирование

      Встроенное тестирование Go: пакет testing, файлы *_test.go, функции TestXxx с *testing.T, команда go test, табличные тесты с t.Run и покрытие через go test -cover.

    3. Пример: HTTP-сервер

      Небольшой HTTP-сервер на стандартной библиотеке Go: net/http, HandleFunc и ListenAndServe, JSON API через encoding/json и маршрутизация по HTTP-методам.

    4. Идиомы Go и что дальше

      Ключевые идиомы Go в одном месте: явная обработка ошибок, плоский код, маленькие интерфейсы и каналы, полезные инструменты go vet и race-детектор, и план дальнейшего изучения.