Предисловие....16
Для кого написана книга....17
Условные обозначения....18
Использование примеров программного кода....19
Благодарности ко второму изданию....19
Благодарности к первому изданию....20
Глава 1. Настройка среды разработки для языка Go....22
Установка средств разработки для языка Go....22
Устранение неполадок при установке Go....23
Инструментарий Go....24
Ваша первая программа на Go....24
Создание модуля Go....24
Команда go build....25
Команда go fmt....26
Команда go vet....29
Выбор инструментов....30
Visual Studio Code....30
GoLand....31
Онлайн-песочница....33
Make-файлы....35
Обязательства по совместимости с Go....36
В курсе последних событий....37
Упражнения....38
Резюме....38
Глава 2. Предописанные типы и объявление переменных....39
Предописанные типы....39
Нулевое значение....39
Литералы....41
Логические значения....43
Числовые типы....43
Пробуем использовать строки и руны....49
Явное преобразование типов....50
Нетипизированные литералы....52
var или :=....52
Использование ключевого слова const....55
Типизированные и нетипизированные константы....57
Неиспользуемые переменные....58
Именование переменных и констант....59
Упражнения....61
Резюме....61
Глава 3. Составные типы....62
Массивы — слишком строгие для того, чтобы использовать их напрямую....62
Срезы....64
Функция len....66
Функция append....66
Емкость среза....67
Функция make....69
Очистка среза....70
Объявление собственного среза....71
Срезание срезов....72
Функция copy....75
Преобразование массивов в срезы....77
Преобразование срезов в массивы....77
Строки в сочетании с рунами и байтами....79
Карты....83
Чтение и запись карты....85
Идиома «запятая-ok»....86
Удаление из карты....87
Очистка карты....87
Сравнение карт....87
Использование карты в качестве множества....88
Структуры....89
Анонимные структуры....92
Сравнение и преобразование структур....92
Упражнения....94
Резюме....95
Глава 4. Блоки, затенение переменных и управляющие конструкции....96
Блоки....96
Затенение переменных....97
Оператор if....100
Четыре вида оператора for....102
Полный оператор for....102
Оператор for, использующий только условие....103
Бесконечный оператор for....103
Ключевые слова break и continue....104
Оператор for-range....106
Операторы for с метками....111
Выбор подходящего оператора for....113
Оператор switch....114
Пустые переключатели....117
Что лучше выбрать, if или switch?....119
Оператор goto....121
Упражнения....123
Резюме....124
Глава 5. Функции....125
Объявление и вызов функций....125
Имитация именованных и опциональных параметров....126
Вариативные входные параметры и срезы....127
Возврат нескольких значений....128
При возврате нескольких значений всегда возвращается несколько значений....129
Игнорирование возвращаемых значений....130
Именованные возвращаемые значения....131
Никогда не используйте пустые операторы возврата!....132
Функции являются значениями....133
Объявление функциональных типов....136
Анонимные функции....137
Замыкания....139
Передача функций в качестве параметров....141
Возвращение функций из функций....142
Оператор defer....143
Go — язык с передачей параметров по значению....148
Упражнения....151
Резюме....151
Глава 6. Указатели....152
Общие сведения об указателях....152
Не бойтесь указателей....156
Указатели служат признаком изменяемых параметров....158
Указатели — это крайняя мера....162
Влияние передачи указателей на производительность....163
Различие между нулевым значением и отсутствием значения....164
Различие между картами и срезами....165
Использование срезов в качестве буферов....169
Уменьшение нагрузки на сборщик мусора....170
Настройка сборщика мусора....174
Упражнения....176
Резюме....176
Глава 7. Типы, методы и интерфейсы....177
Типы в Go....177
Методы....178
Передача приемника по ссылке и по значению....179
Обрабатывайте в методах пустые ссылки на приемники....182
Методы тоже являются функциями....184
Функции или методы?....185
Объявление типа — это не наследование....185
Типы являются исполняемой документацией....186
Йота иногда используется для создания перечислений....187
Используйте встраивание для реализации композиции....190
Встраивание — это не наследование....191
Общее представление об интерфейсах....193
Интерфейсы обеспечивают типобезопасную утиную типизацию....194
Встраивание и интерфейсы....198
Принимайте интерфейсы, возвращайте структуры....198
Интерфейсы и значение nil....200
Интерфейсы можно сравнивать....201
Пустой интерфейс ничего не сообщает....203
Утверждения типа и переключатели типа....204
Используйте утверждения типа и переключатели типа как можно реже....207
Функциональные типы — ключ к интерфейсам....210
Неявные интерфейсы облегчают внедрение зависимостей....211
Утилита Wire....216
Go нельзя назвать объектно-ориентированным языком (и это здорово!)....216
Упражнения....217
Резюме....217
Глава 8. Обобщенные типы....218
Обобщенные типы уменьшают количество повторяющегося кода и повышают типобезопасность....218
Введение в обобщенные типы....221
Обобщенные функции абстрагируют алгоритмы....224
Обобщенные типы и интерфейсы....226
Используйте списки типов для определения операторов....228
Вывод типов и обобщенные типы....231
Списки типов накладывают ограничения на константы и реализации....231
Объединение обобщенных функций с обобщенными структурами....232
Еще о поддержке сравнения....235
Что остается за бортом....236
Идиоматический Go-код и обобщенные типы....238
Добавление обобщенных типов в стандартную библиотеку....241
Какие нововведения нас ожидают....241
Упражнения....242
Резюме....242
Глава 9. Ошибки....243
Как обрабатывать ошибки. Основы....243
Используйте строки в случае простых ошибок....245
Сигнальные ошибки....246
Ошибки являются значениями....248
Обертывание ошибок....251
Обертывание сразу нескольких ошибок....253
Функции Is и As....255
Обертывание ошибок с помощью оператора defer....259
Функции panic и recover....260
Извлечение трассировки стека из ошибки....263
Упражнения....263
Резюме....264
Глава 10. Модули, пакеты и операции импорта....265
Репозитории, модули и пакеты....265
Файл go.mod....266
Выбор версии Go для сборки кода с помощью директивы go....267
Директива require....269
Компиляция пакетов....269
Операции импорта и экспорта....269
Создание и использование пакета....270
Именование пакетов....272
Переопределение имени пакета....273
Комментарии пакета и Go Doc....274
Пакет internal....277
Циклические зависимости....278
Как следует подходить к организации кода модуля....279
Переименование и реорганизация API без потери работоспособности....281
По возможности не используйте функцию init....282
Работа с модулями....283
Импортирование стороннего кода....284
Работа с версиями....288
Выбор минимальной версии....290
Обновление до совместимых версий....292
Обновление до несовместимых версий....292
Вендоринг....294
Сайт pkg.go.dev....295
Публикация своего модуля....296
Версионирование своего модуля....297
Переопределение зависимостей....298
Отзыв версии модуля....299
Использование рабочих пространств для одновременного изменения модулей....300
Прокси-серверы модулей....304
Настройка прокси-сервера....304
Закрытые репозитории....305
Дополнительные подробности....305
Упражнения....305
Резюме....306
Глава 11. Инструменты Go....307
Тестирование небольших программ с помощью go run....307
Добавление сторонних инструментов с помощью go install....308
Форматирование инструкций импорта с помощью goimports....310
Использование сканеров качества кода....311
staticcheck....312
revive....313
golangci-lint....314
Сканирование уязвимых зависимостей с помощью govulncheck....316
Внедрение контента в программу....318
Внедрение скрытых файлов....322
Использование go generate....323
Работа с go generate и файлами Makefile....326
Чтение информации о сборке из двоичного файла Go....327
Сборка двоичных файлов Go для других платформ....328
Использование тегов сборки....329
Тестирование версий Go....331
Получение дополнительной информации об инструментах Go с помощью go help....331
Упражнения....332
Резюме....332
Глава 12. Конкурентность в Go....333
Когда следует использовать конкурентность....333
Горутины....335
Каналы....337
Чтение, запись и буферизация....337
Цикл for-range и каналы....339
Закрытие канала....339
Различия в поведении каналов....340
Оператор select....341
Принципы и паттерны конкурентного программирования....344
Следите за тем, чтобы конкурентности не было в ваших API....344
Горутины, циклы for и изменяющиеся переменные....345
Всегда закрывайте горутины....347
Использование контекста для завершения горутин....348
Когда следует использовать буферизованные и небуферизованные каналы....349
Противодавление....351
Отключение ветвей оператора select....353
Как установить тайм-аут для кода....354
Использование типа WaitGroup....355
Однократное выполнение кода....357
Собираем инструменты для обеспечения конкурентности....359
Когда вместо каналов следует использовать мьютексы....363
Атомарные операции — скорее всего, они вам не понадобятся....367
Где можно найти более подробную информацию о конкурентности....367
Упражнения....368
Резюме....368
Глава 13. Стандартная библиотека....369
Пакет io и его друзья....369
Пакет time....375
Монотонное время....377
Таймеры и тайм-ауты....378
Пакет encoding/json....378
Используйте теги структур для добавления метаданных....378
Демаршалинг и маршалинг....380
Чтение и запись JSON....381
Кодирование и декодирование JSON-потоков....382
Парсинг пользовательского формата JSON....384
Пакет net/http....387
Клиент....388
Сервер....389
ResponseController....395
Структурированное журналирование....396
Упражнения....399
Резюме....400
Глава 14. Контекст....401
Что такое контекст....401
Значения....404
Отмена....411
Контексты с ограниченным сроком действия....416
Управление отменой контекста в собственном коде....420
Упражнения....421
Резюме....422
Глава 15. Написание тестов ....423
Основы тестирования....423
Выдача сообщения о неудачном завершении теста....425
Подготовка и заключительная уборка....426
Тестирование с использованием переменных окружения....428
Расположение образцов тестовых данных....429
Кэширование результатов теста....429
Тестирование своего публичного API....430
Используйте модуль go-cmp для сравнения результатов тестов....431
Табличные тесты....433
Конкурентное выполнение тестов....435
Проверка степени покрытия кода....437
Фаззинг....439
Сравнительные тесты....447
Заглушки в Go....451
Пакет httptest....456
Интеграционные тесты и теги сборки....459
Выявление проблем конкурентности с помощью детектора состояний гонки....461
Упражнения....463
Резюме....463
Глава 16. «Здесь обитают драконы»: пакеты reflect, unsafe и cgo....464
Рефлексия позволяет работать с типами на этапе выполнения....465
Типы, разновидности и значения....467
Создание новых значений....471
Используйте рефлексию для проверки значения интерфейса на равенство nil....473
Используйте рефлексию для создания маршалера данных....474
Создавайте с помощью рефлексии функции для автоматизации повторяющихся задач....479
Рефлексию можно использовать для создания структур, но лучше этого не делать....480
Рефлексия не позволяет создавать методы....480
Используйте рефлексию только тогда, когда в этом есть смысл....481
Использовать пакет unsafe небезопасно....482
Использование Sizeof и Offsetof....484
Использование unsafe для преобразования внешних двоичных данных....486
Доступ к неэкспортируемым полям....490
Вспомогательные инструменты для пакета unsafe....490
Пакет cgo обеспечивает интеграцию, а не повышает производительность....491
Упражнения....496
Резюме....497
Иллюстрация на обложке....499
Об авторе....498
Go быстро завоевал популярность у разработчиков веб-сервисов. Существует множество учебников, помогающих программистам со знанием других языков освоить его синтаксис, но этого недостаточно. Автор Джон Боднер познакомит вас с паттернами проектирования, созданными опытными инженерами Go, и обоснует их применение. В книге собрана наиболее важная информация, необходимая для написания чистого и идиоматического кода. Начните думать как Go-разработчик, вне зависимости от уровня подготовки. В обновленном издании также рассказывается и о современных инструментах Go, упрощающих решение задач, трудновыполнимых на других платформах.