Golang для профи: работа с сетью, многопоточность, структуры данных и машинное обучение с Go

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 работать на реальных производственных системах. Для программистов, которые уже знакомы с основами языка Go, эта книга содержит примеры, шаблоны и четкие объяснения, которые помогут вам глубоко понять возможности Go и применить их в своей работе по программированию. Книга охватывает нюансы Go с подробными руководствами по типам и структурам, пакетам, парал- лелизму, сетевому программированию, дизайну компиляторов, оптимизации и многому другому. Каж- дая глава заканчивается упражнениями и ресурсами, чтобы полностью внедрить ваши новые знания.

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

Language: Russian
Commentary: Vector PDF
Pages: 720
City: СПб.
Tags: Unix; Machine Learning; Neural Networks; Regression; Anomaly Detection; Programming; Debugging; Data Structures; Classification; Clustering; Concurrency; TensorFlow; DNS; Pipelines; Apache Kafka; Docker; Profiling; GitHub; Packages; Network Programming; Go; Web Servers; Git; Coroutines; Testing; IPv6; TCP; UDP; Code Optimization

Об авторе
О научном редакторе
Предисловие
Для кого предназначена эта книга
О чем эта книга
Как получить максимальную пользу от этой книги
Загрузите файлы с примерами кода
Где скачать цветные иллюстрации
Условные обозначения
От издательства
Глава 1. Go и операционная
система
История Go
Куда движется Go?
Преимущества Go
Идеален ли Go?
Утилита godoc
Компиляция Go-кода
Выполнение Go-кода
Два правила Go
Правило пакетов Go: не нужен — не подключай
Правильный вариант размещения фигурных скобок — всего один
Как скачивать Go-пакеты
Стандартные потоки UNIX: stdin, stdout и stderr
Вывод результатов
Использование стандартного потока вывода
Получение данных от пользователя
Что такое := и =
Чтение стандартного потока ввода
Работа с аргументами командной строки
Вывод ошибок
Запись в файлы журнала
Уровни журналирования
Средства журналирования
Серверы журналов
Пример Go-программы, которая записывает информацию в файлы журнала
Функция log.Fatal()
Функция log.Panic()
Запись в специальный файл журнала
Вывод номеров строк в записях журнала
Обработка ошибок в Go
Тип данных error
Обработка ошибок
Использование Docker
Упражнения и ссылки
Резюме
Глава 2. Go изнутри
Компилятор Go
Сборка мусора
Трехцветный алгоритм
Подробнее о работе сборщика мусора Go
Отображения, срезы и сборщик мусора Go
Небезопасный код
Пакет unsafe
Еще один пример использования пакета unsafe
Вызов C-кода из Go
Вызов C-кода из Go в одном файле
Вызов из Go C-кода в отдельных файлах
C-код
Go-код
Сочетание кода на Go и C
Вызов Go-функций из C-кода
Go-пакет
C-код
Ключевое слово defer
Использование defer для журналирования
Функции panic() и recover()
Самостоятельное использование функции panic()
Две полезные UNIX-утилиты
Утилита strace
Утилита dtrace
Среда Go
Команда go env
Go-ассемблер
Узловые деревья
Хотите знать больше о go build?
Создание кода WebAssembly
Краткое введение в WebAssembly
Почему WebAssembly так важен?
Go и WebAssembly
Пример
Использование сгенерированного кода WebAssembly
Общие рекомендации по программированию на Go
Упражнения и ссылки
Резюме
Глава 3. Работа с основными типами данных Go
Числовые типы данных
Целые числа
Числа с плавающей точкой
Комплексные числа
Числовые литералы в Go 2
Циклы Go
Цикл for
Цикл while
Ключевое слово range
Пример применения нескольких циклов Go
Массивы в Go
Многомерные массивы
Недостатки массивов Go
Срезы в Go
Выполнение основных операций со срезами
Автоматическое расширение срезов
Байтовые срезы
Функция copy()
Многомерные срезы
Еще один пример использования срезов
Сортировка срезов с помощью sort.Slice()
Добавление массива к срезу
Отображения Go
Запись в нулевое отображение
Когда использовать отображения
Константы Go
Генератор констант iota
Указатели в Go
Зачем нужны указатели
Время и дата
Работа со временем
Синтаксический анализ времени
Работа с датами
Синтаксический анализ дат
Изменение формата даты и времени
Измерение времени выполнения программы
Измерение скорости работы сборщика мусора Go
Веб-ссылки и упражнения
Резюме
Глава 4. Составные типы данных
Составные типы данных
Структуры
Указатели на структуры
Ключевое слово new
Кортежи
Регулярные выражения и сопоставление с образцом
Немного теории
Простой пример
Более сложный пример
Проверка IPv4-адресов
Строки
Что такое руны?
Пакет unicode
Пакет strings
Оператор switch
Вычисление числа Пи с высокой точностью
Разработка на Go хранилища типа «ключ — значение»
Go и формат JSON
Чтение данных из формата JSON
Сохранение данных в формате JSON
Использование функций Marshal() и Unmarshal()
Синтаксический анализ данных в формате JSON
Go и XML
Чтение XML-файла
Настройка вывода данных в формате XML
Go и формат YAML
Дополнительные ресурсы
Упражнения и ссылки
Резюме
Глава 5. Как улучшить код Go с помощью структур данных
О графах и узлах
Сложность алгоритма
Двоичные деревья в Go
Реализация двоичного дерева в Go
Преимущества двоичных деревьев
Хеш-таблицы в Go
Реализация хеш-таблицы в Go
Реализация функции поиска
Преимущества хеш-таблиц
Связные списки в Go
Реализация связного списка в Go
Преимущества связных списков
Двусвязные списки в Go
Реализация двусвязного списка в Go
Преимущества двусвязных списков
Очереди в Go
Реализация очереди в Go
Стеки в Go
Реализация стека в Go
Пакет container
Использование пакета container/heap
Использование пакета container/list
Использование пакета container/ring
Генерация случайных чисел
Генерация случайных строк
Генерация безопасной последовательности случайных чисел
Выполнение матричных вычислений
Сложение и вычитание матриц
Умножение матриц
Деление матриц
Разгадывание головоломок судоку
Дополнительные ресурсы
Упражнения
Резюме
Глава 6. Неочевидные знания о пакетах и функциях Go
Что такое Go-пакеты
Что такое функции Go
Анонимные функции
Функции, которые возвращают несколько значений
Функции, возвращающие именованные значения
Функции, принимающие указатели
Функции, которые возвращают указатели
Функции, которые возвращают другие функции
Функции, которые принимают другие функции в качестве параметров
Функции с переменным числом параметров
Разработка Go-пакетов
Компиляция Go-пакета
Закрытые переменные и функции
Функция init()
Go-модули
Создание и использование Go-модулей
Использование двух версий одного и того же Go-модуля
Где хранятся Go-модули
Команда go mod vendor
Как писать хорошие Go-пакеты
Пакет syscall
Как на самом деле работает fmt.Println()?
Пакеты go/scanner, go/parser и go/token
Пакет go/ast
Пакет go/scanner
Пакет go/parser
Практический пример
Поиск имен переменных заданной длины
Шаблоны для текста и HTML
Вывод простого текста
Вывод текста в формате HTML
Дополнительные ресурсы
Упражнения
Резюме
Глава 7. Отражения и интерфейсы на все случаи жизни
Методы типов
Интерфейсы в Go
Операции утверждения типа
Как писать свои интерфейсы
Использование интерфейса Go
Использование переключателей для интерфейсов и типов данных
Отражения
Простой пример отражения
Более сложный пример отражения
Три недостатка отражений
Библиотека reflectwalk
Объектно-ориентированное программирование на Go
Основы git и GitHub
Использование git
Отладка с помощью Delve
Пример отладки
Дополнительные ресурсы
Упражнения
Резюме
Глава 8. Как объяснить UNIX-системе, что она должна делать
О процессах в UNIX
Пакет flag
Пакет viper
Простой пример использования viper
От flag к viper
Чтение конфигурационных файлов в формате JSON
Чтение конфигурационных файлов в формате YAML
Пакет cobra
Простой пример cobra
Создание псевдонимов команд
Интерфейсы io.Reader и io.Writer
Буферизованный и небуферизованный ввод и вывод в файл
Пакет bufio
Чтение текстовых файлов
Построчное чтение текстового файла
Чтение текстового файла по словам
Посимвольное чтение текстового файла
Чтение из /dev/random
Чтение заданного количества данных
Преимущества двоичных форматов
Чтение CSV-файлов
Запись в файл
Загрузка и сохранение данных на диске
И снова пакет strings
Пакет bytes
Полномочия доступа к файлам
Обработка сигналов в UNIX
Обработка двух сигналов
Обработка всех сигналов
Программирование UNIX-каналов на Go
Реализация утилиты cat(1) на Go
Структура syscall.PtraceRegs
Отслеживание системных вызовов
Идентификаторы пользователя и группы
Docker API и Go
Дополнительные ресурсы
Упражнения
Резюме
Глава 9. Конкурентность в Go: Go-подпрограммы, каналы и конвейеры
О процессах, потоках и Go-подпрограммах
Планировщик Go
Конкурентность и параллелизм
Go-подпрограммы
Создание Go-подпрограммы
Создание нескольких Go-подпрограмм
Как дождаться завершения Go-подпрограмм, прежде чем закончить программу
Что происходит, если количество вызовов Add() и Done() не совпадает?
Каналы
Запись в канал
Чтение из канала
Прием данных из закрытого канала
Каналы как аргументы функции
Конвейеры
Состояние гонки
Сравнение моделей конкурентности в Go и Rust
Сравнение моделей конкурентности в Go и Erlang
Дополнительные ресурсы
Упражнения
Резюме
Глава 10. Конкурентность в Go: расширенные возможности
И снова о планировщике Go
Переменная среды GOMAXPROCS
Ключевое слово select
Принудительное завершение Go-подпрограммы
Принудительное завершение Go-подпрограммы – способ 1
Принудительное завершение Go-подпрограммы – способ 2
И снова о Go-каналах
Сигнальные каналы
Буферизованные каналы
Нулевые каналы
Каналы каналов
Выбор последовательности исполнения Go-подпрограмм
Как не надо использовать Go-подпрограммы
Общая память и общие переменные
Тип sync.Mutex
Тип sync.RWMutex
Пакет atomic
Совместное использование памяти с помощью Go-подпрограмм
И снова об операторе go
Распознавание состояния гонки
Пакет context
Расширенный пример использования пакета context
Еще один пример использования пакета context
Пулы обработчиков
Дополнительные ресурсы
Упражнения
Резюме
Глава 11. Тестирование, оптимизация и профилирование кода
Оптимизация
Оптимизация кода Go
Профилирование кода Go
Стандартный Go-пакет net/http/pprof
Простой пример профилирования
Удобный внешний пакет для профилирования
Веб-интерфейс Go-профилировщика
Утилита go tool trace
Тестирование кода Go
Написание тестов для существующего кода Go
Тестовое покрытие кода
Тестирование HTTP-сервера с базой данных
Пакет testing/quick
Бенчмаркинг кода Go
Простой пример бенчмаркинга
Неправильно определенные функции бенчмаркинга
Бенчмаркинг буферизованной записи
Обнаружение недоступного кода Go
Кросс-компиляция
Создание примеров функций
От кода Go до машинного кода
Использование ассемблера в Go
Генерация документации
Использование образов Docker
Дополнительные ресурсы
Упражнения
Резюме
Глава 12. Основы сетевого программирования на Go
Что такое net/http, net и http.RoundTripper
Тип http.Response
Тип http.Request
Тип http.Transport
Что такое TCP/IP
Что такое IPv4 и IPv6
Утилита командной строки nc(1)
Чтение конфигурации сетевых интерфейсов
Выполнение DNS-поиска
Получение NS-записей домена
Получение MX-записей домена
Создание веб-сервера на Go
Использование пакета atomic
Профилирование HTTP-сервера
Создание веб-сайта на Go
HTTP-трассировка
Тестирование HTTP-обработчиков
Создание веб-клиента на Go
Как усовершенствовать наш веб-клиент Go
Задержки HTTP-соединений
Подробнее о SetDeadline
Установка периода ожидания на стороне сервера
Еще один способ определить период ожидания
Инструменты Wireshark и tshark
Go и gRPC
Определение файла описания интерфейса
gRPC-клиент
gRPC-сервер
Дополнительные ресурсы
Упражнения
Резюме
Глава 13. Сетевое программирование: создание серверов и клиентов
Работа с HTTPS-трафиком
Создание сертификатов
HTTPS-клиент
Простой HTTPS-сервер
Разработка TLS-сервера и TLS-клиента
Стандартный Go-пакет net
TCP-клиент
Другая версия TCP-клиента
TCP-сервер
Другая версия TCP-сервера
UDP-клиент
Разработка UDP-сервера
Конкурентный TCP-сервер
Удобный конкурентный TCP-сервер
Создание образа Docker для TCP/IP-сервера на Go
Дистанционный вызов процедур
RPC-клиент
RPC-сервер
Низкоуровневое сетевое программирование
Получение необработанных сетевых данных ICMP
Дополнительные ресурсы
Упражнения
Резюме
Глава 14. Машинное обучение
на Go
Вычисление простых статистических показателей
Регрессия
Линейная регрессия
Реализация линейной регрессии
Вывод данных
Классификация
Кластеризация
Выявление аномалий
Нейронные сети
Анализ выбросов
Работа с TensorFlow
Поговорим о Kafka
Дополнительные ресурсы
Упражнения
Резюме
Что дальше?