Оригинальная ссылка: Начните читать исходный код 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Библиотека, после прочтения которой у вас будет более глубокое понимание дизайна интерфейса.
Я просмотрел некоторый исходный код, и это заноза в заднице, но это действительно полезно. Это может быть трудно понять на ранней стадии, и это займет больше времени, но после формирования фиксированного распорядка вы будете все больше и больше с ним знакомиться, и это займет меньше времени и более глубокое понимание.
Я продолжу подводить итоги в последующих действиях, пожалуйста, продолжайте обращать внимание и давайте учиться.
Проект с открытым исходным кодом:
Прошлые статьи: