Начните читать исходный код Go

Go исходный код

Оригинальная ссылка: Начните читать исходный код Go

Прошло много времени с тех пор, как вы изучили основы Go, так что же вам следует изучить дальше? Есть несколько направлений для рассмотрения, таких как веб-разработка, сетевое программирование и т. д.

Перед следующим этапом обучения напишитеПроект с открытым исходным кодом | Распределенная система генерации уникальных идентификаторов, разработанная Go, если вас заинтересовал этот проект, вы можетеGitHubПолучите исходный код.

В процессе написания проекта я обнаружил проблему. Можно реализовать эту функцию, но я не знаю, соответствует ли написанный мной код стилю Go и достаточно ли он элегантен. Поэтому я думаю, что лучше перейти к нижнему уровню, заложить хороший фундамент и заложить хороший фундамент для написания кода Go, чем продолжать изучать разработку приложений.

Итак, я решил начать читать исходный код стандартной библиотеки Go. Всего в Go более 150 стандартных библиотек. Не невозможно прочитать их все, но это определенно большой проект. Надеюсь, я смогу его придерживаться.

Зачем начинать читать с исходного кода стандартной библиотеки Go? Поскольку я недавно прочитал несколько книг об основных принципах Go, честно говоря, такие вещи, как планирование горутин и сборка мусора gc, совершенно непонятны. Если вы прочтете эту часть кода, как только доберетесь до нее, боюсь, вы откажетесь от непосредственного изучения языка Go.

Стандартная библиотека отличается: часть кода вообще не затрагивает базовый принцип, а реализация относительно проста, но в то же время она может углубить понимание концепции Go, которая идеально подходит в качестве входа. Затем от простого к сложному, шаг за шагом, точно так же, как сражение с монстрами и апгрейд, шаг за шагом покоряйте Го.

Сказав все это, как вы должны это читать? Я подумал о некоторых способах:

  • См. официальную документацию по стандартной библиотеке.
  • Посмотрите технические статьи других людей в Интернете.
  • Напишите несколько примеров, чтобы попрактиковаться в использовании.
  • Если можете, реализуйте функции стандартной библиотеки самостоятельно.
  • Обобщите свой читательский опыт.

Вы можете комбинировать один или несколько вышеперечисленных методов, а затем продолжать читать и обобщать, и, наконец, найти метод, полностью подходящий для вас.

Ниже приведены некоторые из стандартных библиотек и функций, которые я суммировал:

  • archive/tarи/zip-compress: Функция сжатия (распаковки) файла.
  • fmt-io-bufio-path/filepath-flag:
    • fmt: Предоставляет форматированные функции ввода и вывода.
    • io: Предоставляет основные функции ввода и вывода, большинство из которых являются пакетами системных функций.
    • bufio: Инкапсуляция буферизованных функций ввода и вывода.
    • path/filepath: Используется для управления путем имени целевого файла в текущей системе.
    • flag: Обеспечивает операции с аргументами командной строки.
  • strings-strconv-unicode-regexp-bytes:
    • strings: Обеспечивает операции над строками.
    • strconv: Предоставляет функции для преобразования строк в базовые типы.
    • unicode: Предоставляет специальные функции для строк Unicode.
    • regexp: Функция регулярного выражения.
    • bytes: Обеспечивает операции с осколками персонажей.
    • index/suffixarray: Быстрый запрос подстроки.
  • math-math/cmath-math/big-math/rand-sort:
    • math: Основные математические функции.
    • math/cmath: Операции над комплексными числами.
    • math/rand: Генерация псевдослучайных чисел.
    • sort: Сортировка и настройка коллекций для массивов.
    • math/big: Реализация и вычисление больших чисел.
  • container-/list-/ring-/heap:
    • list: двусвязный список.
    • ring: Круговой связанный список.
    • heap: куча.
  • compress/bzip2-/flate-/gzip-/lzw-zlib:
    • compress/bzip2: Реализовать декомпрессию bzip2.
    • flate: формат сжатия данных, реализующий deflate, как описано в RFC 1951.
    • gzip: Чтение и запись файлов, сжатых gzip.
    • lzw: Реализация формата сжатых данных Lempel Ziv Welch.
    • zlib: Чтение и запись формата сжатия данных zlib.
  • context: используется для упрощения операций, связанных с запросом данных домена, сигналов отмены, крайних сроков и т. д., между несколькими горутинами, обрабатывающими один запрос.
  • crypto-crypto/md5-crypto/sha1:
    • crypto: набор часто используемых криптографических констант.
    • crypto/md5: Шифрование MD5.
    • crypto/sha1: Шифрование SHA1.
  • errors: метод, реализующий ошибку операции.
  • expvar: Предоставляет стандартизированный интерфейс для общедоступных переменных.
  • hash: Общий интерфейс, реализованный всеми хеш-функциями.
  • html: Функция экранирования текста HTML.
  • sort: Предоставляет примитивные функции для сортировки срезов и пользовательских коллекций.
  • unsafe: содержит некоторые команды, нарушающие «безопасность типов» языка Go, которые не используются в общих программах и могут использоваться в вызовах программ C/C++.
  • syscall-os-os/exec:
    • syscall: Предоставляет базовый интерфейс для низкоуровневых вызовов операционной системы.
    • os: Предоставляет нам независимый от платформы интерфейс функций операционной системы, принимает Unix-подобный дизайн, скрывает различия между различными операционными системами и заставляет разные файловые системы и объекты операционной системы вести себя одинаково.
    • os/exec: Предоставляет возможность запускать внешние команды и программы операционной системы.
  • time-log:
    • time: Основные операции с датой и временем.
    • log: запись журнала, созданного при запуске программы.
  • encoding/json-encoding/xml-text/template:
    • encoding/json: Чтение и декодирование, запись и кодирование данных JSON.
    • encoding/xml: Простой парсер XML1.0.
    • text/template: создание HTML-подобных шаблонов на основе данных, сочетающих данные и текст.
  • net-net/http:
    • net: основные операции с сетевыми данными.
    • http: Предоставляет расширяемый HTTP-сервер и базовый клиент, который анализирует HTTP-запросы и ответы.
  • runtime: взаимодействия среды выполнения программы Go, такие как сборка мусора и создание сопрограмм.
  • reflect: Реализуйте через отражение времени выполнения программы, позвольте программе работать с переменными любого типа.

Здесь указана только часть стандартной библиотеки, более полный список стандартных библиотек можно найти непосредственно на официальном сайте.

Итак, вопрос в том, с чего начать с таким количеством библиотек?

Я сделаю здесь простую классификацию, из-за ограниченного уровня я могу сделать только простую сортировку, а затем каждый может сделать выбор, исходя из своей реальной ситуации.

Некоторые библиотеки требуют очень специальных знаний, и коэффициент ввода-вывода может быть относительно низким. Напримерarchive,compressа такжеcrypto, что предполагает знание алгоритмов сжатия и алгоритмов шифрования.

Некоторые библиотеки относятся к категории инструментов, напримерbufio,bytes,strings,path,strconvи т. д., эти библиотеки не требуют знания предметной области и их легче читать.

Некоторые библиотеки относятся к работе с операционной системой, напримерos,net,syncд., изучение этих библиотек требует четкого понимания операционной системы.

netМногие из приведенных ниже подпакетов связаны с сетевыми протоколами, такими какnet/http, с участиемhttpАнализ пакетов требует лучшего понимания сетевых протоколов.

Если вы хотите получить глубокое понимание основных принципов языка, вам необходимо прочитатьruntimeбиблиотека.

Чтобы быстро приступить к работе и понять философию дизайна языка, рекомендуется прочитатьioа такжеfmtБиблиотека, после прочтения которой у вас будет более глубокое понимание дизайна интерфейса.

Я просмотрел некоторый исходный код, и это заноза в заднице, но это действительно полезно. Это может быть трудно понять на ранней стадии, и это займет больше времени, но после формирования фиксированного распорядка вы будете все больше и больше с ним знакомиться, и это займет меньше времени и более глубокое понимание.

Я продолжу подводить итоги в последующих действиях, пожалуйста, продолжайте обращать внимание и давайте учиться.


Проект с открытым исходным кодом:

Прошлые статьи: