Go: идиомы и паттерны проектирования Год издания: 2022 Автор: Боднер Джон Переводчик: Черников С. В. Издательство: Питер ISBN: 978-5-4461-1885-4 Серия: Бестселлеры O’Reilly Язык: Русский Формат: PDF Качество: Издательский макет или текст (eBook) Интерактивное оглавление: Да Количество страниц: 416 Описание: Go быстро набирает популярность в качестве языка для создания веб-сервисов. Существует множество учебников по синтаксису Go, но знать его недостаточно. Автор Джон Боднер описывает и объясняет паттерны проектирования, используемые опытными разработчиками. В книге собрана наиболее важная информация, необходимая для написания чистого и идиоматического Go-кода. Вы научитесь думать как Go-разработчик, вне зависимости от предыдущего опыта программирования.
Примеры страниц
Оглавление
Предисловие.......................................................................................................................................13
Для кого написана книга....................................................................................................................14
Условные обозначения.......................................................................................................................14
Использование примеров программного кода...................................................................................15
Благодарности.........................................................................................................................................16
От издательства......................................................................................................................................17
Глава 1. Настройка среды разработки для языка Go...........................................................................18
Установка средств разработки для языка Go......................................................................................18
Рабочее пространство Go..................................................................................................................19
Команда go................................................................................................................................................21
Команды go run и go build..........................................................................................................21
Установка сторонних инструментов для Go..................................................................................23
Форматирование кода.................................................................................................................24
Выбор инструментов............................................................................................................................26
Visual Studio Code............................................................................................................................26
GoLand.................................................................................................................................................28
Онлайн-песочница.........................................................................................................................29
make-файлы..............................................................................................................................................31
Обновление средств разработки...................................................................................................33
Резюме........................................................................................................................................................34
Глава 2. Простые типы и объявление переменных................................................................................35
Встроенные типы...................................................................................................................................35
Нулевое значение...........................................................................................................................35
Литералы............................................................................................................................................36
Логические значения....................................................................................................................38
Числовые типы.................................................................................................................................38
Пробуем использовать строки и руны..........................................................................................46
Явное преобразование типов...................................................................................................46
var или :=....................................................................................................................................................48
Использование ключевого слова const.......................................................................................51
Типизированные и нетипизированные константы................................................................52
Неиспользуемые переменные.........................................................................................................53
Именование переменных и констант...........................................................................................54
Резюме........................................................................................................................................................56
Глава 3. Составные типы............................................................................................................................57
Массивы — слишком строгие для того, чтобы использовать их напрямую...............................................57
Срезы...........................................................................................................................................................59
Функция len.......................................................................................................................................61
Функция append..............................................................................................................................61
Емкость среза...................................................................................................................................62
Функция make..................................................................................................................................64
Объявление собственного среза............................................................................................65
Срезание срезов.............................................................................................................................67
Преобразование массивов в срезы.......................................................................................70
Функция copy....................................................................................................................................70
Строки в сочетании с рунами и байтами.....................................................................................72
Карты...........................................................................................................................................................76
Чтение и запись карты..................................................................................................................79
Идиома «запятая-ok».....................................................................................................................79
Удаление из карты..........................................................................................................................80
Использование карты в качестве множества........................................................................................81
Структуры..................................................................................................................................................82
Анонимные структуры...........................................................................................................................85
Сравнение и преобразование структур..............................................................................................86
Резюме........................................................................................................................................................87
Глава 4. Блоки, затенение переменных и управляющие конструкции....................................................88
Блоки............................................................................................................................................................88
Затенение переменных..........................................................................................................................89
Выявление затененных переменных.......................................................................................................91
Оператор if................................................................................................................................................93
Четыре вида оператора for................................................................................................................94
Полный оператор for.....................................................................................................................95
Оператор for, использующий только условие..............................................................................96
Бесконечный оператор for.........................................................................................................96
Ключевые слова break и continue...........................................................................................97
Оператор for-range.........................................................................................................................99
Операторы for с метками.........................................................................................................104
Выбор подходящего оператора for.................................................................................................105
Оператор switch...................................................................................................................................107
Пустые переключатели....................................................................................................................110
Что лучше выбрать: if или switch?................................................................................................111
Оператор goto......................................................................................................................................112
Резюме.....................................................................................................................................................115
Глава 5. Функции..................................................................................................................................116
Объявление и вызов функций......................................................................................................116
Имитация именованных и опциональных параметров..................................................................117
Вариативные входные параметры и срезы.....................................................................................118
Возврат нескольких значений...............................................................................................119
При возврате нескольких значений всегда возвращается
несколько значений...................................................................................................................120
Игнорирование возвращаемых значений....................................................................................121
Именованные возвращаемые значения......................................................................................122
Никогда не используйте пустые операторы возврата!.............................................................123
Функции являются значениями....................................................................................................125
Объявление функциональных типов.................................................................................127
Анонимные функции..................................................................................................................127
Замыкания..............................................................................................................................................128
Передача функций в качестве параметров.....................................................................129
Возвращение функций из функций.....................................................................................131
Оператор defer.....................................................................................................................................132
Go — язык с передачей параметров по значению..............................................................136
Резюме.....................................................................................................................................................139
Глава 6. Указатели...........................................................................................................................140
Общие сведения об указателях....................................................................................................140
Не бойтесь указателей......................................................................................................................144
Указатели служат для указания изменяемых параметров................................................................146
Указатели — это крайняя мера.....................................................................................................151
Влияние передачи указателей на производительность...............................................................152
Различие между нулевым значением и отсутствием значения....................................................153
Различие между картами и срезами..........................................................................................154
Использование срезов в качестве буферов...........................................................................157
Уменьшение нагрузки на сборщик мусора.............................................................................159
Резюме.....................................................................................................................................................163
Глава 7. Типы, методы и интерфейсы....................................................................................................164
Типы в Go................................................................................................................................................164
Методы.....................................................................................................................................................165
Приемники указателей и приемники значений...............................................................................166
Пишите код методов с расчетом на экземпляр, равный nil.....................................................168
Методы тоже являются функциями.....................................................................................170
Функции или методы?................................................................................................................171
Объявление типа не является наследованием..............................................................172
Типы являются исполняемой документацией................................................................173
Йота (иногда) используется для создания перечислений...............................................173
Используйте встраивание для реализации композиции.................................................176
Встраивание не является наследованием...............................................................................177
Общее представление об интерфейсах....................................................................................179
Интерфейсы обеспечивают типобезопасную утиную типизацию............................................179
Встраивание и интерфейсы............................................................................................................184
Принимайте интерфейсы, возвращайте структуры......................................................................184
Интерфейсы и значение nil.............................................................................................................186
Пустой интерфейс ничего не сообщает....................................................................................187
Утверждения типа и переключатели типа...............................................................................188
Используйте утверждения типа и переключатели типа как можно реже................................191
Функциональные типы — ключ к интерфейсам.............................................................................194
Неявные интерфейсы облегчают внедрение зависимостей............................................................195
Утилита Wire...........................................................................................................................................200
Go нельзя назвать объектно-ориентированным языком (и это здорово!)...........................................200
Резюме.....................................................................................................................................................200
Глава 8. Ошибки..............................................................................................................................201
Как обрабатывать ошибки: основы............................................................................................201
Используйте строки в случае простых ошибок....................................................................203
Сигнальные ошибки..........................................................................................................................204
Ошибки являются значениями.....................................................................................................206
Обертывание ошибок.......................................................................................................................209
Функции Is и As.....................................................................................................................................212
Обертывание ошибок с помощью оператора defer............................................................215
Функции panic и recover...................................................................................................................216
Извлечение трассировки стека из ошибки.............................................................................219
Резюме.....................................................................................................................................................219
Глава 9. Модули, пакеты и операции импорта...............................................................................220
Репозитории, модули и пакеты.....................................................................................................220
Файл go.mod..........................................................................................................................................221
Компиляция пакетов.........................................................................................................................222
Операции импорта и экспорта..............................................................................................222
Создание и использование пакета......................................................................................222
Именование пакетов..................................................................................................................225
Как следует подходить к организации кода модуля...................................................226
Переопределение имени пакета..........................................................................................227
Комментарии пакета и godoc.................................................................................................228
Пакет internal.................................................................................................................................230
По возможности не используйте функцию init...........................................................................231
Циклические зависимости......................................................................................................232
Переименование и реорганизация API без потери работоспособности.....................................233
Работа с модулями..............................................................................................................................235
Импортирование стороннего кода.....................................................................................235
Работа с версиями.......................................................................................................................238
Выбор минимальной версии..................................................................................................241
Обновление до совместимых версий................................................................................241
Обновление до несовместимых версий...........................................................................242
Вендоринг.......................................................................................................................................244
Сайт pkg.go.dev.............................................................................................................................245
Дополнительная информация...............................................................................................245
Публикация своего модуля............................................................................................................245
Версионирование своего модуля...............................................................................................246
Прокси-серверы модулей...............................................................................................................248
Указание прокси-сервера........................................................................................................248
Закрытые репозитории.............................................................................................................249
Резюме.....................................................................................................................................................250
Глава 10. Конкурентность в Go............................................................................................................251
Когда следует использовать конкурентность.......................................................................................251
Горутины.................................................................................................................................................253
Каналы......................................................................................................................................................255
Чтение, запись и буферизация..............................................................................................255
Цикл for-range и каналы............................................................................................................257
Закрытие канала...........................................................................................................................257
Различия в поведении каналов.............................................................................................258
Оператор select....................................................................................................................................259
Принципы и паттерны конкурентного программирования...........................................262
Следите за тем, чтобы конкурентности не было в ваших API..................................263
Горутины, циклы for и изменяющиеся переменные....................................................263
Всегда закрывайте горутины..................................................................................................264
Паттерн на основе канала done............................................................................................266
Прекращение выполнения горутины с помощью функции отмены............................................267
Когда следует использовать буферизованные и небуферизованные
каналы...............................................................................................................................................268
Противодавление........................................................................................................................269
Отключение ветвей оператора select................................................................................270
Как можно установить тайм-аут для кода.........................................................................271
Использование типа WaitGroup............................................................................................272
Однократное выполнение кода............................................................................................274
Собираем инструменты для обеспечения конкурентности..............................................275
Когда вместо каналов следует использовать мьютексы...................................................279
Атомарные операции — скорее всего, они вам не понадобятся.................................284
Где можно найти более подробную информацию о конкурентности........................284
Резюме...................................................................................................................................285
Глава 11. Стандартная библиотека.............................................................................................286
Пакет io и его друзья.........................................................................................................................286
Пакет time...............................................................................................................................................292
Монотонное время.....................................................................................................................294
Таймеры и тайм-ауты..................................................................................................................295
Пакет encoding/json...........................................................................................................................295
Используйте теги структур для добавления метаданных........................................................295
Демаршализация и маршализация.....................................................................................297
JSON, считыватели и записыватели.....................................................................................298
Кодирование и декодирование JSON-потоков.....................................................................299
Парсинг пользовательского формата JSON...............................................................................301
Пакет net/http.......................................................................................................................................303
Клиент...............................................................................................................................................303
Сервер...............................................................................................................................................304
Промежуточный слой..........................................................................................................................307
Резюме.....................................................................................................................................................310
Глава 12. Контекст...............................................................................................................................311
Что такое контекст..............................................................................................................................311
Отмена.....................................................................................................................................................314
Таймеры...................................................................................................................................................318
Управление отменой контекста в собственном коде............................................................................321
Значения.................................................................................................................................................322
Резюме.....................................................................................................................................................329
Глава 13. Написание тестов..............................................................................................................330
Основы тестирования.......................................................................................................................330
Выдача сообщения о неудачном завершении теста...................................................332
Подготовка и заключительная «уборка»...........................................................................333
Расположение образцов тестовых данных......................................................................335
Кэширование результатов теста...........................................................................................335
Тестирование своего публичного API................................................................................335
Используйте модуль go-cmp для сравнения результатов тестов................................................337
Табличные тесты..................................................................................................................................339
Проверка степени покрытия кода..............................................................................................341
Сравнительные тесты.......................................................................................................................343
Заглушки в Go.......................................................................................................................................348
Пакет httptest........................................................................................................................................354
Интеграционные тесты и теги сборки.......................................................................................356
Выявление проблем конкурентности с помощью детектора
состояний гонки..................................................................................................................................358
Резюме.....................................................................................................................................................360
Глава 14. Здесь водятся драконы: пакеты reflect, unsafe и cgo................................................361
Рефлексия позволяет нам работать с типами на этапе выполнения..........................362
Типы, разновидности и значения.........................................................................................364
Создание новых значений.......................................................................................................369
Используйте рефлексию для проверки значения интерфейса
на равенство значению nil.......................................................................................................370
Используйте рефлексию для создания маршализатора данных...........................371
Создавайте с помощью рефлексии функции
для автоматизации повторяющихся задач......................................................................376
Рефлексию можно использовать для создания структур,
но лучше этого не делать.........................................................................................................378
Рефлексия не позволяет создавать методы....................................................................378
Используйте рефлексию только тогда, когда в этом есть смысл...........................378
Использовать пакет unsafe небезопасно.................................................................................380
Используйте пакет unsafe для преобразования внешних
двоичных данных.........................................................................................................................381
Пакет unsafe в сочетании со строками и срезами........................................................385
Вспомогательные инструменты для пакета unsafe......................................................386
Пакет cgo предназначен для обеспечения интеграции, а не повышения производительности...387
Резюме.................................................................................................................................................391
Глава 15. Взгляд в будущее: обобщенные типы в Go...................................................................392
Обобщенные типы уменьшают количество повторяющегося кода
и повышают типобезопасность....................................................................................................392
Добавление обобщенных типов в Go........................................................................................395
Используйте списки типов для определения операторов.......................................................401
Обобщенные функции абстрагируют алгоритмы................................................................402
Списки типов накладывают ограничения на константы и реализации..................................403
Что остается «за бортом».................................................................................................................407
Идиоматический Go-код и обобщенные типы..................................................................................409
Какие нововведения нас ожидают..............................................................................................410
Резюме.....................................................................................................................................................411
Об авторе..........................................................................................................................................412
Об обложке........................................................................................................................................413