Об авторе....17
О научном редакторе....18
Предисловие....19
Для кого эта книга....19
Структура издания....19
Как сделать книгу максимально полезной....21
Файлы с примерами кода....22
Цветные иллюстрации....22
Условные обозначения....22
От издательства....23
Глава 1. Краткое введение в Go....24
Введение в Go....25
История Go....26
Почему UNIX, а не Windows....27
Преимущества Go....28
Утилиты go doc и godoc....30
Hello World!....31
Введение в функции....32
Введение в пакеты....32
Запуск Go-кода....33
Компиляция Go-кода....33
Использование Go в качестве языка скриптов....33
Важные правила форматирования и кодирования....34
Важные особенности Go....35
Определение и использование переменных....36
Управление ходом выполнения программы....39
Итерации с помощью циклов for и range....41
Получение пользовательского ввода....43
Использование переменных ошибок для различения типов входных данных....48
Знакомство с моделью параллелизма в Go....49
Разработка утилиты which(1) на Go....51
Вывод информации в лог....54
Функции log.Fatal() и log.Panic()....56
Запись в пользовательский файл журнала....58
Вывод номеров строк в записях журнала....59
Обзор Go-дженериков....61
Разработка базового приложения телефонной книги....62
Упражнения....66
Резюме....66
Дополнительные ресурсы....67
Глава 2. Основные типы данных Go....68
Тип данных error....69
Числовые типы данных....72
Нечисловые типы данных....75
Строки, символы и руны....75
Время и даты....82
Go-константы....87
Генератор констант iota....88
Группировка схожих данных....90
Массивы....90
Срезы....91
Указатели....108
Генерация случайных чисел....112
Генерация случайных строк....113
Генерация безопасных случайных чисел....114
Обновление приложения телефонной книги....115
Упражнения....117
Резюме....117
Дополнительные ресурсы....117
Глава 3. Составные типы данных....118
Карты....119
Сохранение в карту nil....120
Перебор карт....122
Структуры....123
Определение новых структур....123
Использование ключевого слова new....124
Срезы структур....126
Регулярные выражения и сопоставление с образцом....128
О регулярных выражениях Go....129
Сопоставление имен и фамилий....130
Сопоставление целых чисел....131
Сопоставление полей записи....132
Улучшение приложения телефонной книги....133
Работа с CSV-файлами....133
Добавление индекса....137
Улучшенная версия приложения для телефонной книги....138
Упражнения....146
Резюме....147
Дополнительные ресурсы....147
Глава 4. Рефлексия и интерфейсы....148
Рефлексия....149
Изучение внутренней структуры Go-структуры....151
Изменение значений структуры с использованием рефлексии....153
Три недостатка рефлексии....154
Методы типа....155
Создание методов типа....155
Использование методов типа....156
Интерфейсы....159
Интерфейс sort.Interface....162
Пустой интерфейс....164
Утверждения типа и переключатели типов....166
Карта map[string]interface{}....170
Тип данных error....173
Написание собственных интерфейсов....176
Работа с двумя различными форматами файлов CSV....182
Объектно-ориентированное программирование в Go....185
Обновление приложения телефонной книги....189
Настройка значения CSV-файла....189
Использование пакета sort....190
Упражнения....192
Резюме....192
Дополнительные ресурсы....193
Глава 5. Пакеты и функции Go....194
Go-пакеты....195
Скачивание Go-пакетов....195
Функции....198
Анонимные функции....198
Функции, возвращающие несколько значений....199
Возвращаемые значения функции могут иметь имя....200
Функции, которые принимают другие функции в качестве параметров....201
Функции могут возвращать другие функции....202
Функции с переменным количеством параметров....204
Ключевое слово defer....208
Разработка собственных пакетов....210
Функция init()....211
Порядок исполнения....212
Использование GitHub для хранения Go-пакетов....213
Пакет для работы с базой данных....215
Знакомство с базой данных....216
Хранение Go-пакета....220
Дизайн Go-пакета....221
Реализация Go-пакета....223
Тестирование Go-пакета....230
Модули....233
Создание более качественных пакетов....234
Создание документации....235
GitLab Runners и Go....242
Начальная версия файла конфигурации....243
Окончательная версия конфигурационного файла....245
GitHub Actions и Go....246
Хранение секретов в GitHub....248
Окончательная версия конфигурационного файла....248
Утилиты управления версиями....250
Упражнения....252
Резюме....252
Дополнительные ресурсы....253
Глава 6. Даем указания системе UNIX....254
stdin, stdout и stderr....255
Процессы UNIX....256
Обработка сигналов UNIX....256
Файловый ввод-вывод....260
Интерфейсы io.Reader и io.Writer....260
Правильное и неправильное использование io.Reader и io.Writer....261
Буферизованный и небуферизованный файловый ввод-вывод....265
Чтение текстовых файлов....266
Чтение текстового файла построчно....266
Чтение текстового файла слово за словом....267
Чтение текстового файла символ за символом....269
Чтение из /dev/random....270
Считывание определенного объема данных из файла....271
Запись в файл....272
Работа с JSON....275
Использование Marshal() и Unmarshal()....275
Структуры и JSON....277
Чтение и запись данных JSON в виде потоков....278
Структурный вывод записи JSON....279
Работа с XML....281
Преобразование JSON в XML и обратно....282
Работа с YAML....283
Пакет viper....285
Использование флагов командной строки....286
Чтение конфигурационных файлов JSON....289
Пакет cobra....292
Утилита с тремя командами....294
Добавление флагов командной строки....294
Создание псевдонимов команд....295
Создание подкоманд....296
Поиск циклов в файловой системе UNIX....297
Новое в Go 1.16....300
Встраивание файлов....300
ReadDir и DirEntry....303
Пакет io/fs....304
Обновление приложения телефонной книги....306
Использование cobra....307
Хранение и загрузка данных в формате JSON....308
Реализация команды delete....308
Реализация команды insert....309
Реализация команды list....309
Реализация команды search....310
Упражнения....311
Резюме....312
Дополнительные ресурсы....312
Глава 7. Параллельное выполнение в Go....313
Процессы, потоки и горутины....314
Планировщик Go....315
Переменная среды GOMAXPROCS....317
Параллелизм и распараллеливание....319
Горутины....319
Создание горутины....320
Создание нескольких горутин....321
Ожидание завершения горутин....321
Что делать, если количество вызовов Add() и Done() разное....323
Создание нескольких файлов с помощью горутин....325
Каналы....326
Запись в канал и чтение из него....326
Прием из закрытого канала....329
Каналы как параметры функций....330
Состояния гонки....331
Ключевое слово select....333
Установка тайм-аута горутины....335
Ограничение времени выполнения горутины — внутри main()....335
Ограничение времени выполнения горутины — вне main()....337
Еще раз о каналах в Go....338
Буферизованные каналы....339
Nil-каналы....340
Пулы рабочих процессов....342
Сигнальные каналы....345
Общая память и общие переменные....348
Тип sync.Mutex....349
Тип sync.RWMutex....351
Пакет atomic....354
Совместное использование памяти с помощью горутин....356
Закрытые переменные и оператор go....358
Пакет context....360
Пакет semaphore....365
Упражнения....368
Резюме....368
Дополнительные ресурсы....369
Глава 8. Создание веб-сервисов....370
Пакет net/http....371
Тип http.Response....371
Тип http.Request....372
Тип http.Transport....372
Создание веб-сервера....373
Обновление приложения телефонной книги....377
Определение API....377
Реализация обработчиков....378
Предоставление метрик для Prometheus....386
Пакет runtime/metrics....387
Предоставление метрик....389
Чтение метрик....396
Ввод метрик в Prometheus....397
Визуализация метрик Prometheus в Grafana....401
Разработка веб-клиентов....403
Использование http.NewRequest() для улучшения работы клиента....404
Создание клиента для сервиса телефонной книги....407
Создание файловых серверов....412
Загрузка содержимого приложения телефонной книги....414
Время ожидания HTTP-соединений....416
Использование функции SetDeadline()....416
Установка периода ожидания на стороне клиента....417
Установка времени ожидания на стороне сервера....420
Упражнения....421
Резюме....421
Дополнительные ресурсы....422
Глава 9. Работа с TCP/IP и WebSocket....423
TCP/IP....424
Пакет net....426
Разработка TCP-клиента....426
Разработка TCP-клиента с помощью net.Dial()....426
Разработка TCP-клиента, использующего net.DialTCP()....428
Разработка TCP-сервера....430
Разработка TCP-сервера с помощью net.Listen()....430
Разработка TCP-сервера, использующего net.ListenTCP()....433
Разработка UDP-клиента....435
Разработка UDP-сервера....437
Разработка параллельных TCP-серверов....440
Работа с доменными сокетами UNIX....442
Сервер на сокетах домена UNIX....442
Клиент сокета домена UNIX....444
Создание сервера WebSocket....447
Реализация сервера....448
Создание клиента WebSocket....455
Упражнения....459
Резюме....460
Дополнительные ресурсы....460
Глава 10. Работа с REST API....461
Введение в REST....462
Разработка серверов и клиентов RESTful....464
Сервер RESTful....465
Клиент RESTful....473
Создание функционального сервера RESTful....481
REST API....482
Использование пакета gorilla/mux....483
Использование подмаршрутизаторов....484
Работа с базой данных....484
Тестирование пакета restdb....490
Реализация сервера RESTful....491
Тестирование сервера RESTful....495
Создание клиента RESTful....499
Создание структуры клиента командной строки....500
Реализация клиентских команд RESTful....501
Использование клиента RESTful....505
Работа с несколькими версиями REST API....507
Загрузка и скачивание двоичных файлов....507
Использование Swagger для документации REST API....512
Документирование REST API....514
Создание файла документации....517
Обслуживание файла документации....518
Упражнения....521
Резюме....521
Дополнительные ресурсы....521
Глава 11. Тестирование и профилирование кода....523
Оптимизация кода....524
Оценка производительности....525
Переписывание функции main() для более качественного тестирования....526
Анализ производительности буферизованной записи и чтения....527
Утилита benchstat....531
Неправильно определенные бенчмарк-функции....532
Профилирование кода....533
Профилирование приложения командной строки....534
Профилирование HTTP-сервера....537
Веб-интерфейс профилировщика Go....539
Утилита go tool trace....540
Трассировка веб-сервера со стороны клиента....542
Посещение всех маршрутов веб-сервера....544
Тестирование Go-кода....548
Написание тестов для ./ch03/intRE.go....549
Функция TempDir()....551
Функция Cleanup()....551
Пакет testing/quick....553
Тайм-аут тестов....555
Покрытие тестового кода....556
Поиск недостижимого Go-кода....559
Тестирование HTTP-сервера с помощью серверной части базы данных....561
Фаззинг....566
Кросс-компиляция....567
Использование директивы go:generate....569
Создание примеров функций....571
Упражнения....573
Резюме....573
Дополнительные ресурсы....574
Глава 12. Работа с gRPC....575
Введение в gRPC....575
Буферы протокола....576
Определение файла языка определения интерфейса....577
Разработка сервера gRPC....581
Разработка клиента gRPC....584
Упражнения....588
Резюме....588
Дополнительные ресурсы....589
Глава 13. Дженерики Go....590
Введение в дженерики....591
Ограничения....593
Определение новых типов данных с помощью дженериков....596
Интерфейсы и дженерики....600
Рефлексия и дженерики....602
Упражнения....604
Резюме....605
Дополнительные ресурсы....605
Приложение. Сборщик мусора Go....607
Куча и стек....607
Сборка мусора....611
Алгоритм трех цветов....614
Подробнее о работе сборщика мусора в Go....617
Карты, срезы и сборщик мусора Go....618
Сравнение эффективности представленных техник....621
Дополнительные ресурсы....622
Вам уже знакомы основы языка Go? В таком случае эта книга для вас. Михалис Цукалос продемонстрирует возможности языка, даст понятные и простые объяснения, приведет примеры и предложит эффективные паттерны программирования.
Изучая нюансы Go, вы освоите типы и структуры данных языка, а также работу с пакетами, конкурентность, сетевое программирование, устройство компиляторов, оптимизацию и многое другое. Закрепить новые знания помогут материалы и упражнения в конце каждой главы.
Уникальным материалом станет глава о машинном обучении на языке Go, в которой вы пройдёте от основополагающих статистических приемов до регрессии и кластеризации. Вы изучите классификацию, нейронные сети и приёмы выявления аномалий. Из прикладных разделов вы узнаете: как использовать Go с Docker и Kubernetes, Git, WebAssembly, JSON и др.