Golang для профи: Создаем профессиональные утилиты, параллельные серверы и сервисы

This document was uploaded by one of our users. The uploader already confirmed that they had the permission to publish it. If you are author/publisher or own the copyright of this documents, please report to us by using this DMCA report form.

Simply click on the Download Book button.

Yes, Book downloads on Ebookily are 100% Free.

Sometimes the book is free on Amazon As well, so go ahead and hit "Search on Amazon"

Язык Go — это простой и понятный язык для создания высокопроизводительных систем будущего. Используйте Go в реальных производственных системах. В новое издание включены такие темы, как создание серверов и клиентов RESTful, знакомство с дженериками Go и разработка серверов и клиентов gRPC. Третье издание «Golang для профи» исследует практические возможности Go и описывает такие продвинутые темы, как параллелизм и работа сборщика мусора Go, использование Go с Docker, разработка мощных утилит командной строки, обработка данных в формате JSON (javascript Object Notation) и взаимодействие с базами данных. Кроме того, книга дает дополнительные сведения о работе внутренних механизмов Go, знание которых позволит оптимизировать код на Go и использовать типы и структуры данных новыми и необычными способами. Также охватываются некоторые нюансы и идиомы языка Go, предлагаются упражнения и приводятся ссылки на ресурсы для закрепления полученных знаний. Станьте опытным программистом на Go, создавая системы и внедряя передовые методы программирования на Go в свои проекты! https://github.com/mactsouk/mastering-Go-3rd

Author(s): Михалис Цукалос
Series: Для профессионалов
Edition: 3
Publisher: Питер
Year: 2024

Language: Russian
Pages: 624
City: СПб.
Tags: go

Краткое содержание
Оглавление
Об авторе
О научном редакторе
Предисловие
Для кого эта книга
Структура издания
Как сделать книгу максимально полезной
Файлы с примерами кода
Цветные иллюстрации
Условные обозначения
От издательства
Глава 1. Краткое введение в Go
Введение в Go
История Go
Почему UNIX, а не Windows
Преимущества Go
Утилиты go doc и godoc
Hello World!
Введение в функции
Введение в пакеты
Запуск Go-кода
Компиляция Go-кода
Использование Go в качестве языка скриптов
Важные правила форматирования и кодирования
Важные особенности Go
Определение и использование переменных
Вывод переменных
Управление ходом выполнения программы
Итерации с помощью циклов for и range
Получение пользовательского ввода
Чтение стандартного ввода
Работа с аргументами командной строки
Использование переменных ошибок для различения типов входных данных
Знакомство с моделью параллелизма в Go
Разработка утилиты which(1) на Go
Вывод информации в лог
Функции log.Fatal() и log.Panic()
Запись в пользовательский файл журнала
Вывод номеров строк в записях журнала
Обзор Go-дженериков
Разработка базового приложения телефонной книги
Упражнения
Резюме
Дополнительные ресурсы
Глава 2. Основные типы данных Go
Тип данных error
Числовые типы данных
Нечисловые типы данных
Строки, символы и руны
Преобразование из int в string
Пакет unicode
Пакет strings
Время и даты
Утилита для анализа дат и времени
Работа с часовыми поясами
Go-константы
Генератор констант iota
Группировка схожих данных
Массивы
Срезы
О длине и емкости среза
Выбор части среза
Байтовые срезы
Удаление элемента из среза
Как срезы связаны с массивами
Функция copy()
Сортировка срезов
Указатели
Генерация случайных чисел
Генерация случайных строк
Генерация безопасных случайных чисел
Обновление приложения телефонной книги
Упражнения
Резюме
Дополнительные ресурсы
Глава 3. Составные типы данных
Карты
Сохранение в карту nil
Перебор карт
Структуры
Определение новых структур
Использование ключевого слова new
Срезы структур
Регулярные выражения и сопоставление с образцом
О регулярных выражениях Go
Сопоставление имен и фамилий
Сопоставление целых чисел
Сопоставление полей записи
Улучшение приложения телефонной книги
Работа с CSV-файлами
Добавление индекса
Улучшенная версия приложения для телефонной книги
Упражнения
Резюме
Дополнительные ресурсы
Глава 4. Рефлексия и интерфейсы
Рефлексия
Изучение внутренней структуры Go-структуры
Изменение значений структуры с использованием рефлексии
Три недостатка рефлексии
Методы типа
Создание методов типа
Использование методов типа
Интерфейсы
Интерфейс sort.Interface
Пустой интерфейс
Утверждения типа и переключатели типов
Карта map[string]interface{}
Тип данных error
Написание собственных интерфейсов
Использование Go-интерфейса
Реализация интерфейса sort.Interface для 3D-фигур
Работа с двумя различными форматами файлов CSV
Объектно-ориентированное программирование в Go
Обновление приложения телефонной книги
Настройка значения CSV-файла
Использование пакета sort
Упражнения
Резюме
Дополнительные ресурсы
Глава 5. Пакеты и функции Go
Go-пакеты
Скачивание Go-пакетов
Функции
Анонимные функции
Функции, возвращающие несколько значений
Возвращаемые значения функции могут иметь имя
Функции, которые принимают другие функции в качестве параметров
Функции могут возвращать другие функции
Функции с переменным количеством параметров
Ключевое слово defer
Разработка собственных пакетов
Функция init()
Порядок исполнения
Использование GitHub для хранения Go-пакетов
Пакет для работы с базой данных
Знакомство с базой данных
Хранение Go-пакета
Дизайн Go-пакета
Реализация Go-пакета
Тестирование Go-пакета
Модули
Создание более качественных пакетов
Создание документации
GitLab Runners и Go
Начальная версия файла конфигурации
Окончательная версия конфигурационного файла
GitHub Actions и Go
Хранение секретов в GitHub
Окончательная версия конфигурационного файла
Утилиты управления версиями
Упражнения
Резюме
Дополнительные ресурсы
Глава 6. Даем указания системе UNIX
stdin, stdout и stderr
Процессы UNIX
Обработка сигналов UNIX
Файловый ввод-вывод
Интерфейсы io.Reader и io.Writer
Правильное и неправильное использование io.Reader и io.Writer
Буферизованный и небуферизованный файловый ввод-вывод
Чтение текстовых файлов
Чтение текстового файла построчно
Чтение текстового файла слово за словом
Чтение текстового файла символ за символом
Чтение из /dev/random
Считывание определенного объема данных из файла
Запись в файл
Работа с JSON
Использование Marshal() и Unmarshal()
Структуры и JSON
Чтение и запись данных JSON в виде потоков
Структурный вывод записи JSON
Работа с XML
Преобразование JSON в XML и обратно
Работа с YAML
Пакет viper
Использование флагов командной строки
Чтение конфигурационных файлов JSON
Пакет cobra
Утилита с тремя командами
Добавление флагов командной строки
Создание псевдонимов команд
Создание подкоманд
Поиск циклов в файловой системе UNIX
Новое в Go 1.16
Встраивание файлов
ReadDir и DirEntry
Пакет io/fs
Обновление приложения телефонной книги
Использование cobra
Хранение и загрузка данных в формате JSON
Реализация команды delete
Реализация команды insert
Реализация команды list
Реализация команды search
Упражнения
Резюме
Дополнительные ресурсы
Глава 7. Параллельное выполнение в Go
Процессы, потоки и горутины
Планировщик Go
Переменная среды GOMAXPROCS
Параллелизм и распараллеливание
Горутины
Создание горутины
Создание нескольких горутин
Ожидание завершения горутин
Что делать, если количество вызовов Add() и Done() разное
Создание нескольких файлов с помощью горутин
Каналы
Запись в канал и чтение из него
Прием из закрытого канала
Каналы как параметры функций
Состояния гонки
Ключевое слово select
Установка тайм-аута горутины
Ограничение времени выполнения горутины — внутри main()
Ограничение времени выполнения горутины — вне main()
Еще раз о каналах в Go
Буферизованные каналы
Nil-каналы
Пулы рабочих процессов
Сигнальные каналы
Указание порядка выполнения для ваших горутин
Общая память и общие переменные
Тип sync.Mutex
Что будет, если забыть разблокировать мьютекс
Тип sync.RWMutex
Пакет atomic
Совместное использование памяти с помощью горутин
Закрытые переменные и оператор go
Пакет context
Пакет semaphore
Упражнения
Резюме
Дополнительные ресурсы
Глава 8. Создание веб-сервисов
Пакет net/http
Тип http.Response
Тип http.Request
Тип http.Transport
Создание веб-сервера
Обновление приложения телефонной книги
Определение API
Реализация обработчиков
Предоставление метрик для Prometheus
Пакет runtime/metrics
Предоставление метрик
Создание образа Docker для Go-сервера
Предоставление желаемых метрик
Чтение метрик
Ввод метрик в Prometheus
Визуализация метрик Prometheus в Grafana
Разработка веб-клиентов
Использование http.NewRequest() для улучшения работы клиента
Создание клиента для сервиса телефонной книги
Создание файловых серверов
Загрузка содержимого приложения телефонной книги
Время ожидания HTTP-соединений
Использование функции SetDeadline()
Установка периода ожидания на стороне клиента
Установка времени ожидания на стороне сервера
Упражнения
Резюме
Дополнительные ресурсы
Глава 9. Работа с TCP/IP и WebSocket
TCP/IP
Пакет net
Разработка TCP-клиента
Разработка TCP-клиента с помощью net.Dial()
Разработка TCP-клиента, использующего net.DialTCP()
Разработка TCP-сервера
Разработка TCP-сервера с помощью net.Listen()
Разработка TCP-сервера, использующего net.ListenTCP()
Разработка UDP-клиента
Разработка UDP-сервера
Разработка параллельных TCP-серверов
Работа с доменными сокетами UNIX
Сервер на сокетах домена UNIX
Клиент сокета домена UNIX
Создание сервера WebSocket
Реализация сервера
Использование websocat
Использование JavaScript
Создание клиента WebSocket
Упражнения
Резюме
Дополнительные ресурсы
Глава 10. Работа с REST API
Введение в REST
Разработка серверов и клиентов RESTful
Сервер RESTful
Клиент RESTful
Создание функционального сервера RESTful
REST API
Использование пакета gorilla/mux
Использование подмаршрутизаторов
Работа с базой данных
Тестирование пакета restdb
Реализация сервера RESTful
Тестирование сервера RESTful
Тестирование обработчиков GET
Тестирование обработчиков POST
Тестирование обработчика PUT
Тестирование обработчика DELETE
Создание клиента RESTful
Создание структуры клиента командной строки
Реализация клиентских команд RESTful
Использование клиента RESTful
Работа с несколькими версиями REST API
Загрузка и скачивание двоичных файлов
Использование Swagger для документации REST API
Документирование REST API
Создание файла документации
Обслуживание файла документации
Упражнения
Резюме
Дополнительные ресурсы
Глава 11. Тестирование и профилирование кода
Оптимизация кода
Оценка производительности
Переписывание функции main() для более качественного тестирования
Анализ производительности буферизованной записи и чтения
Утилита benchstat
Неправильно определенные бенчмарк-функции
Профилирование кода
Профилирование приложения командной строки
Профилирование HTTP-сервера
Веб-интерфейс профилировщика Go
Утилита go tool trace
Трассировка веб-сервера со стороны клиента
Посещение всех маршрутов веб-сервера
Тестирование Go-кода
Написание тестов для ./ch03/intRE.go
Функция TempDir()
Функция Cleanup()
Пакет testing/quick
Тайм-аут тестов
Покрытие тестового кода
Поиск недостижимого Go-кода
Тестирование HTTP-сервера с помощью серверной части базы данных
Фаззинг
Кросс-компиляция
Использование директивы go:generate
Создание примеров функций
Упражнения
Резюме
Дополнительные ресурсы
Глава 12. Работа с gRPC
Введение в gRPC
Буферы протокола
Определение файла языка определения интерфейса
Разработка сервера gRPC
Разработка клиента gRPC
Упражнения
Резюме
Дополнительные ресурсы
Глава 13. Дженерики Go
Введение в дженерики
Ограничения
Определение новых типов данных с помощью дженериков
Интерфейсы и дженерики
Рефлексия и дженерики
Упражнения
Резюме
Дополнительные ресурсы
Приложение. Сборщик мусора Go
Куча и стек
Сборка мусора
Алгоритм трех цветов
Подробнее о работе сборщика мусора в Go
Карты, срезы и сборщик мусора Go
Использование среза
Использование карты с указателями
Использование карты без указателей
Разделение карты
Сравнение эффективности представленных техник
Дополнительные ресурсы