Go быстро набирает популярность в качестве языка для создания веб-сервисов. Существует множество учебников по синтаксису Go, но знать его недостаточно. Автор Джон Боднер описывает и объясняет паттерны проектирования, используемые опытными разработчиками. В книге собрана наиболее важная информация, необходимая для написания чистого и идиоматического Go-кода. Вы научитесь думать как Go-разработчик, вне зависимости от предыдущего опыта программирования.
Author(s): Джон Боднер
Series: Бестселлеры O’Reilly
Edition: 1
Publisher: Питер
Year: 2022
Language: Russian
Commentary: Vector PDF
Pages: 416
City: СПб.
Tags: Programming; Concurrency; Modules; Packages; Go; Error Handling; Closures; Testing; Standard Library; Elementary
Предисловие
Для кого написана книга
Условные обозначения
Использование примеров программного кода
Благодарности
От издательства
Глава 1. Настройка среды разработки
для языка Go
Установка средств разработки для языка Go
Рабочее пространство Go
Команда go
Команды go run и go build
Установка сторонних инструментов для Go
Форматирование кода
Выбор инструментов
Visual Studio Code
GoLand
Онлайн-песочница
make-файлы
Обновление средств разработки
Резюме
Глава 2. Простые типы и объявление переменных
Встроенные типы
Нулевое значение
Литералы
Логические значения
Числовые типы
Пробуем использовать строки и руны
Явное преобразование типов
var или :=
Использование ключевого слова const
Типизированные и нетипизированные константы
Неиспользуемые переменные
Именование переменных и констант
Резюме
Глава 3. Составные типы
Массивы — слишком строгие для того, чтобы использовать их напрямую
Срезы
Функция len
Функция append
Емкость среза
Функция make
Объявление собственного среза
Срезание срезов
Преобразование массивов в срезы
Функция copy
Строки в сочетании с рунами и байтами
Карты
Чтение и запись карты
Идиома «запятая-ok»
Удаление из карты
Использование карты в качестве множества
Структуры
Анонимные структуры
Сравнение и преобразование структур
Резюме
Глава 4. Блоки, затенение переменных и управляющие конструкции
Блоки
Затенение переменных
Выявление затененных переменных
Оператор if
Четыре вида оператора for
Полный оператор for
Оператор for, использующий только условие
Бесконечный оператор for
Ключевые слова break и continue
Оператор for-range
Операторы for с метками
Выбор подходящего оператора for
Оператор switch
Пустые переключатели
Что лучше выбрать: if или switch?
Оператор goto
Резюме
Глава 5. Функции
Объявление и вызов функций
Имитация именованных и опциональных параметров
Вариативные входные параметры и срезы
Возврат нескольких значений
При возврате нескольких значений всегда возвращается несколько значений
Игнорирование возвращаемых значений
Именованные возвращаемые значения
Никогда не используйте пустые операторы возврата!
Функции являются значениями
Объявление функциональных типов
Анонимные функции
Замыкания
Передача функций в качестве параметров
Возвращение функций из функций
Оператор defer
Go — язык с передачей параметров по значению
Резюме
Глава 6. Указатели
Общие сведения об указателях
Не бойтесь указателей
Указатели служат для указания изменяемых параметров
Указатели — это крайняя мера
Влияние передачи указателей на производительность
Различие между нулевым значением и отсутствием значения
Различие между картами и срезами
Использование срезов в качестве буферов
Уменьшение нагрузки на сборщик мусора
Резюме
Глава 7. Типы, методы и интерфейсы
Типы в Go
Методы
Приемники указателей и приемники значений
Пишите код методов с расчетом на экземпляр, равный nil
Методы тоже являются функциями
Функции или методы?
Объявление типа не является наследованием
Типы являются исполняемой документацией
Йота (иногда) используется для создания перечислений
Используйте встраивание для реализации композиции
Встраивание не является наследованием
Общее представление об интерфейсах
Интерфейсы обеспечивают типобезопасную утиную типизацию
Встраивание и интерфейсы
Принимайте интерфейсы, возвращайте структуры
Интерфейсы и значение nil
Пустой интерфейс ничего не сообщает
Утверждения типа и переключатели типа
Используйте утверждения типа и переключатели типа как можно реже
Функциональные типы — ключ к интерфейсам
Неявные интерфейсы облегчают внедрение зависимостей
Утилита Wire
Go нельзя назвать объектно-ориентированным языком (и это здорово!)
Резюме
Глава 8. Ошибки
Как обрабатывать ошибки: основы
Используйте строки в случае простых ошибок
Сигнальные ошибки
Ошибки являются значениями
Обертывание ошибок
Функции Is и As
Обертывание ошибок с помощью оператора defer
Функции panic и recover
Извлечение трассировки стека из ошибки
Резюме
Глава 9. Модули, пакеты и операции импорта
Репозитории, модули и пакеты
Файл go.mod
Компиляция пакетов
Операции импорта и экспорта
Создание и использование пакета
Именование пакетов
Как следует подходить к организации кода модуля
Переопределение имени пакета
Комментарии пакета и godoc
Пакет internal
По возможности не используйте функцию init
Циклические зависимости
Переименование и реорганизация API без потери работоспособности
Работа с модулями
Импортирование стороннего кода
Работа с версиями
Выбор минимальной версии
Обновление до совместимых версий
Обновление до несовместимых версий
Вендоринг
Сайт pkg.go.dev
Дополнительная информация
Публикация своего модуля
Версионирование своего модуля
Прокси-серверы модулей
Указание прокси-сервера
Закрытые репозитории
Резюме
Глава 10. Конкурентность в Go
Когда следует использовать конкурентность
Горутины
Каналы
Чтение, запись и буферизация
Цикл for-range и каналы
Закрытие канала
Различия в поведении каналов
Оператор select
Принципы и паттерны конкурентного программирования
Следите за тем, чтобы конкурентности не было в ваших API
Горутины, циклы for и изменяющиеся переменные
Всегда закрывайте горутины
Паттерн на основе канала done
Прекращение выполнения горутины с помощью функции отмены
Когда следует использовать буферизованные и небуферизованные каналы
Противодавление
Отключение ветвей оператора select
Как можно установить тайм-аут для кода
Использование типа WaitGroup
Однократное выполнение кода
Собираем инструменты для обеспечения конкурентности
Когда вместо каналов следует использовать мьютексы
Атомарные операции — скорее всего, они вам не понадобятся
Где можно найти более подробную информацию о конкурентности
Резюме
Глава 11. Стандартная библиотека
Пакет io и его друзья
Пакет time
Монотонное время
Таймеры и тайм-ауты
Пакет encoding/json
Используйте теги структур для добавления метаданных
Демаршализация и маршализация
JSON, считыватели и записыватели
Кодирование и декодирование JSON-потоков
Парсинг пользовательского формата JSON
Пакет net/http
Клиент
Сервер
Промежуточный слой
Резюме
Глава 12. Контекст
Что такое контекст
Отмена
Таймеры
Управление отменой контекста в собственном коде
Значения
Резюме
Глава 13. Написание тестов
Основы тестирования
Выдача сообщения о неудачном завершении теста
Подготовка и заключительная «уборка»
Расположение образцов тестовых данных
Кэширование результатов теста
Тестирование своего публичного API
Используйте модуль go-cmp для сравнения результатов тестов
Табличные тесты
Проверка степени покрытия кода
Сравнительные тесты
Заглушки в Go
Пакет httptest
Интеграционные тесты и теги сборки
Выявление проблем конкурентности с помощью детектора состояний гонки
Резюме
Глава 14. Здесь водятся драконы:
пакеты reflect, unsafe и cgo
Рефлексия позволяет нам работать с типами на этапе выполнения
Типы, разновидности и значения
Создание новых значений
Используйте рефлексию для проверки значения интерфейса на равенство значению nil
Используйте рефлексию для создания маршализатора данных
Создавайте с помощью рефлексии функции для автоматизации повторяющихся задач
Рефлексию можно использовать для создания структур, но лучше этого не делать
Рефлексия не позволяет создавать методы
Используйте рефлексию только тогда, когда в этом есть смысл
Использовать пакет unsafe небезопасно
Используйте пакет unsafe для преобразования внешних двоичных данных
Пакет unsafe в сочетании со строками и срезами
Вспомогательные инструменты для пакета unsafe
Пакет cgo предназначен для обеспечения интеграции, а не повышения производительности
Резюме
Глава 15. Взгляд в будущее:
обобщенные типы в Go
Обобщенные типы уменьшают количество повторяющегося кода и повышают типобезопасность
Добавление обобщенных типов в Go
Используйте списки типов для определения операторов
Обобщенные функции абстрагируют алгоритмы
Списки типов накладывают ограничения на константы и реализации
Что остается «за бортом»
Идиоматический Go-код и обобщенные типы
Какие нововведения нас ожидают
Резюме
Об авторе
Об обложке