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