Сначала кратко разберу структуру книги по главам, после чего напишу вывод, а также перечислю плюсы и минусы книги.
Учебник
Это ознакомительная глава по работе с языком Go. Рассказывается о происхождении языка, приводится пример hello world, рассматриваются запуск и компиляция, концепция модулей (пакетов), объявление функций, форматирование кода, работа с аргументами командной строки, объявление переменных, краткое знакомство с for. Также разбирается поиск повторяющихся строк несколькими способами, работа с изображениями и URL, и даже создание примитивного веб-сервера.
Структура программы
Разбираются зарезервированные слова, именование переменных, функций и констант. Описывается, как объявлять переменные (через var, const, type, func), какие части можно опускать и как группировать несколько объявлений. Подробно рассмотрены указатели и создание переменных через функцию new. Затронута тема времени жизни и области видимости переменных, а также присваивания значений. Также показано использование внешних пакетов, подключение и инкапсуляция данных.
Фундаментальные типы данных
Рассматриваются числа (целые, с плавающей точкой), бинарные и побитовые операторы и их приоритет, сравнение чисел. Описана работа с комплексными числами в Go, булевыми значениями. Разбираются строки, управляющие последовательности и строковые литералы, руны — для работы с Unicode-символами. Приводится преобразование строк в числа и обратно. Также рассматриваются константы и псевдо-enum-ы.
Составные типы данных
Здесь речь идет о более сложных типах данных: массивах (последовательности фиксированной длины), срезах (динамические последовательности), отображениях (map — коллекция пар ключ-значение) и структурах. Рассматриваются создание, инициализация, сравнение и основные функции для работы с массивами и срезами. Приводится несколько примеров работы с отображениями. Структуры подробно разобраны, включая работу с JSON и использование функций Marshal и Unmarshal. В завершение — пример работы с HTML посредством Go.
Функции
Достаточно подробный раздел о функциях. В начале — теоретический материал, затем — пример рекурсивной обработки HTML. Разбирается возврат нескольких значений и одна из ключевых концепций языка — проверка ошибок через if err != nil. Подробно рассмотрены анонимные функции и вариативные функции (принимающие переменное количество параметров).
Методы
Так как в Go нет привычной для многих классической ООП-модели, работа с объектами осуществляется через структуры и методы (функции, ассоциированные со структурами). При этом затрагиваются понятия инкапсуляции, а также показывается, как можно реализовать одну и ту же задачу как через обычную функцию, так и через метод.
Интерфейсы
Глава о создании и использовании интерфейсов. В начале — теоретическая часть, объясняющая назначение интерфейсов и способы их реализации. Из стандартных интерфейсов рассмотрены интерфейсы для сортировки, работы с веб-сервером и обработки ошибок. Также поднимаются темы декларации типов и обработки аварийных ситуаций. Если ранее был пример с JSON, то здесь уже рассматривается работа с XML.
Go-подпрограммы и каналы. Параллельность
Следуют две главы, посвящённые параллельному программированию. В первой — больше теории и примеров, включая фундаментальную тему Go — каналы (в том числе буферизированные и однонаправленные) и конструкция select.
Во второй главе примеров меньше, но акцент сделан на проблемах, которые могут возникать при параллельной работе (например, состояние гонки), и способах их решения (с использованием sync.Mutex и sync.RWMutex).
Пакеты и инструменты Go
Хотя с концепцией пакетов и модулей читатель уже знаком, здесь этому уделяется больше внимания. Подробно рассматриваются импорты, а также подчеркивается возможность использовать сторонние библиотеки, а не только стандартные.
Вторая часть главы посвящена инструментам Go: компиляции, установке пакетов и зависимостей, тестированию и многому другому. Также описывается организация рабочего пространства и структура каталогов.
Тестирование
Одна из последних глав посвящена тестированию кода средствами Go (go test), кратко описанному в предыдущей главе. Упоминаются сторонние библиотеки для тестирования. В остальном глава типична: зачем нужны тесты, как правильно и неправильно писать, что такое хрупкие тесты, покрытие кода тестами и прочее.
Рефлексия и низкоуровневое программирование
Две завершающие, самые короткие главы. Они ориентированы на более опытных разработчиков. Первая — про рефлексию: например, если нужно создать собственный статический анализатор или инструмент для анализа кода. Вторая — про низкоуровневое программирование: когда возможностей самого Go недостаточно, и приходится обращаться к библиотекам C или использовать вызовы ОС.
Вывод
Для кого эта книга подойдет?
Она подойдет как тем, кто решил познакомиться с языком с нуля, так и тем, кто уже несколько лет работает с Go и хочет систематизировать, закрепить и углубить знания.
Плюсу:
- Легко и понятно читается.
- Четкая структура: каждая следующая глава логически продолжает предыдущую.
- Много примеров кода.
- После каждой главы — практические упражнения.
Минусы:
- Не уверен, выходили ли обновления книги, но на момент чтения не были покрыты некоторые новые возможности языка, такие как generics.
- Объем книги — 400+ страниц, что может быть барьером для тех, кто не привык читать техническую литературу такого объема.