- Оригинальный адрес:A bird's eye view of Go
- Оригинальный автор:Axel Wagner
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:JackEggie
- Корректор:40m41h42t, JalanJiang
Перейти к обзору языка
Аннотация: В этой статье в очень общем виде обобщается определение, экосистема и реализация языка Go, а также делается попытка предоставить справочные документы, соответствующие различным требованиям.Подробности см. в конце этой статьи.
Всякий раз, когда мы говорим о «языке го», мы можем говорить о множестве совершенно разных вещей из-за разных сценариев. Поэтому я попытался дать обзор языка Go и его экосистемы, а также перечислить соответствующую документацию в каждом разделе (вероятно, это какая-то мешанина из проблем, с которыми я столкнулся в последнее время). Давайте начнем:
Перейти язык программирования
Язык Go — это язык программирования. как авторитет,Спецификация языка GoСпецификация формата кода и значение, представляемое кодом, определены в . Все, что не соответствует этой спецификации, не является языком Go. Аналогично, в этой спецификациинетУпоминания не считаются частью языка. Спецификация в настоящее время поддерживается командой разработчиков языка Go, и новая версия выпускается каждые шесть месяцев. Последняя версия на момент написания статьи:1.12.
Спецификация языка Go гласит:
- грамматика
- Типы, значения и семантика переменных
- Предварительно объявленные идентификаторы и их значения
- Как работают программы Go
- специальныйнебезопасный пакет(хотя не вся семантика охвачена)
спецификациядолженВам достаточно реализовать компилятор Go. Фактически, многие люди реализовали множество различных компиляторов на основе этого.
Компилятор Go и его среда выполнения
Спецификация языка — это всего лишь текстовый документ, сам по себе не очень полезный. Вам нужно программное обеспечение, которое реализует эту семантику, а именно компилятор (анализирует, проверяет исходный код и превращает его в исполняемую форму) и среду выполнения (предоставляет среду, необходимую для запуска кода). Таких программных комбинаций много, и все они более или менее разные. Пример выглядит следующим образом:
-
gc, чистая реализация языка Go (с небольшой реализацией сборки), компилятор и среда выполнения, разработанная командой разработчиков языка Go. Он поставляется с языком Go. В отличие от других подобных инструментов,gcнетстрогийРазличайте компиляторы, ассемблеры и компоновщики — они совместно используют много кода при реализации и разделяют или передают некоторые важные обязанности. Поэтому обычно невозможно связать файлы, созданные разными версиями.gcскомпилированный пакет. - gccgo и либго, внешний интерфейс для gcc и его среда выполнения. Он реализован на C и также поддерживается командой разработчиков Go. Однако, поскольку он является частью организации gcc и выпускается в соответствии с циклом выпуска gcc, он обычно немного отстает от «последней» версии спецификации языка Go.
- llgo, интерфейс для LLVM. Я мало что знаю об этом.
-
gopherjs, компилирует код Go в JavaScript и использует виртуальную машину JavaScript и некоторый пользовательский код в качестве среды выполнения. В долгосрочной перспективе, поскольку
gcС встроенной поддержкой WebAssembly он может быть устаревшим. - tinygo, неполная реализация мелкомасштабного программирования. Он может работать на микроконтроллере (голое железо) или виртуальной машине WebAssembly путем настройки среды выполнения. Из-за своих ограничений,технически говоряОн не реализует все возможности языка Go — в основном потому, что ему не хватает сборщика мусора, параллелизма и отражения.
Есть много других реализаций, но этого достаточно, чтобы дать вам представление о различных реализациях. Каждый из вышеперечисленных подходов использует свой подход к языку Go и имеет свои отличительные черты. Их возможные различия (чтобы проиллюстрировать это, некоторые из следующих утверждений могут быть немного причудливыми):
-
int/uintразмер - может быть 32-битной или 64-битной длины. - Как основные функции реализованы в среде выполнения, такие как выделение памяти, сборка мусора и параллелизм.
- траверс
mapПорядок не определен в языке Go -gcочевидно рандомизирует такие операции, в то время какgopherjsОбход будет реализован в используемом вами JavaScript. -
appendОбъем дополнительного пространства памяти, необходимого для выделения операции, однакопри выделении дополнительного места,Не будуСнова выделите больше памяти. -
unsafe.Pointerиuintptrпреобразование между. Особо указать,gcимеет свое мнение о том, когда этот переход должен вступить в силуправило. как правило,unsafeПакет виртуальный, он будет реализован в компиляторе.
Вообще говоря, некоторые детали, не упомянутые в спецификации (особенно упомянутые выше), могут привести к тому, что ваша программа будет работать с разными компиляторами.компилировать, но часто программа ведет себя не так, как вы ожидаетенормальная работа. Поэтому вы должны сделать все возможное, чтобы избежать подобных вещей.
Если ваш язык Go установлен через «обычный» канал (скачайте и установите его с официального сайта или установите через менеджер пакетов), то вы получите команду разработчиков Go, чтобы предоставитьgcи официальная среда выполнения. В этой статье, когда мы говорим о том, «как Go это делает», мы обычно говорим об этом, если контекст не говорит об обратном.gc. Потому что это самое важное для реализации.
стандартная библиотека
стандартная библиотека— это набор зависимостей, включенных в язык Go, которые можно использовать для создания множества полезных приложений из коробки. Он также поддерживается командой разработчиков Go и будет выпущен с языком и компилятором Go. Как правило, реализация стандартной библиотеки может правильно работать только с тем компилятором, с которым она выпущена. Поскольку большинство (но не все) сред выполнения являются частью стандартной библиотеки (в основном содержащейся вruntime,reflect,syscallв сумке). Поскольку компилятор должен быть совместим с используемой в настоящее время средой выполнения при компиляции, их версии должны быть одинаковыми. стандартная библиотекаAPIстабилен и не будет меняться несовместимым образом, поэтому программы Go, написанные для данной версии стандартной библиотеки, будут нормально работать в будущих версиях компилятора.
Некоторые стандартные библиотеки полностью реализуют все в самой библиотеке, а другие реализуют только части библиотеки — разработчики особенноruntime,reflect,unsafeиsyscallРеализовать пользовательский функционал в пакете. например, я верюСтандартная библиотека AppEngineНекоторые функции стандартной библиотеки реализованы заново из соображений безопасности. Такие перереализованные части обычно максимально прозрачны для пользователя.
Существует такжеАвтономные библиотеки, отличные от стандартной библиотеки, с точки зрения непрофессионала этоxИли "библиотека расширений". Эта библиотека содержит части кода, разработанные и одновременно поддерживаемые командой разработчиков Go, ноНе будуИмеет тот же цикл выпуска, что и язык Go, и по сравнению сСам язык Go, совместимость тоже будет плохой (функционал и ремонтопригодность тоже будут плохими). Код в ней является либо экспериментальным (и может быть включен в стандартную библиотеку в будущем), либо менее общим, чем тот, что есть в стандартной библиотеке, либо, в некоторых редких случаях, предоставляет разработчикам способ проверки кода. в синхронизации с командой разработчиков Go.
Опять же, если не указано иное, говоря о «стандартной библиотеке», мы имеем в виду официально поддерживаемую и выпущенную, размещенную наgolang.orgСтандартная библиотека Go на .
инструмент для создания кода
Нам нужны инструменты для создания кода, чтобы упростить использование языка Go. Основная обязанность инструмента сборки — найти пакеты и все зависимости, которые необходимо скомпилировать, и вызвать компилятор и компоновщик с необходимыми параметрами. Язык Go имеетпакетная поддержка, что позволяет обрабатывать несколько файлов исходного кода как единое целое во время компиляции. Это также определяет, как импортируются и используются другие пакеты. Но важно то, что это не определяет, как путь импортированного пакета сопоставляется с исходным файлом, а также не определяет, где импортированный пакет находится на диске. Поэтому каждый инструмент сборки решает эту проблему по-своему. Вы можете использовать инструменты сборки общего назначения (например, команду Make), но есть также много инструментов сборки, созданных специально для Go:
-
Перейти языковые инструменты[1]Это инструмент сборки, официально поддерживаемый командой разработчиков Go. Это то же самое, что и язык Go (
gcи стандартная библиотека) имеют одинаковый цикл выпуска. это требуетGOROOTкаталог (значение получается из переменной среды, которая будет генерировать значение по умолчанию во время установки) для хранения компилятора, стандартной библиотеки и различных других инструментов. Он требует, чтобы весь исходный код хранился вGOPATHкаталог (это значение также берется из переменной окружения, по умолчанию$HOME/goили эквивалентное значение). Например, пакетa/bИсходный код должен находиться где-то вроде$GOPATH/src/a/b/c.goпод дорожкой. и$GOPATH/src/a/bпуть должен бытьТолькоСодержит исходные файлы в пакете. В распределенном режиме существует механизмРекурсивно загрузить пакет и его зависимости с произвольного сервера, даже если механизм не поддерживает контроль версий или проверку загрузки. В инструменты языка Go также включены многие другие наборы инструментов, в том числе инструменты для тестирования кода Go, инструменты для чтения документации (golang.orgразвертывается с инструментами языка Go), инструментами для создания отчетов об ошибках и различными другими гаджетами. - gopherjsВстроенные инструменты сборки, которые во многом имитируют инструменты языка Go.
- gomobile— это инструмент для создания кода Go специально для мобильных операционных систем.
- dep,gb,glideEtc. — это разработанные сообществом инструменты сборки и управления зависимостями, каждый из которых имеет свой уникальный способ компоновки файлов (некоторые из них совместимы с инструментами языка Go, некоторые — нет) и объявленные зависимости.
- bazel— это версия внутренних инструментов сборки Google с открытым исходным кодом. Хотя его использование на самом деле не ограничивается языком Go, я включил его в качестве отдельного элемента, потому что часто говорят, что языковые инструменты Go предназначены для обслуживания Google и противоречат потребностям сообщества. Однако инструменты языка Go (и многие другие открытые инструменты) не могут использоваться Google, поскольку bazel использует несовместимый способ компоновки файлов.
Инструменты для создания кода — это важный инструмент, который большинство пользователей используют непосредственно при написании кода, поэтому он во многом определяетЯзыковая экосистема GoВсе аспекты пакета также определяют способ объединения пакетов, что также повлияет на то, как программисты Go общаются и общаются. Как упоминалось выше, на инструменты языка Go неявно ссылаются (если не указана другая среда выполнения), поэтому его дизайн может оказать большое влияние на общественное восприятие «языка Go». Хотя существует множество доступных альтернативных инструментов, которые также широко используются в таких сценариях, как использование внутри компании, сообщество открытого исходного кодакак правилоНадеемся, что языковые инструменты Go совместимы с тем, как используется язык Go, а это означает:
- Доступен исходный код. Инструменты языка Go имеют очень ограниченную поддержку бинарного распространения пакетов, и только эта поддержка будет удалена в будущем выпуске.
- основываться наGo официальный формат документанаписать документ.
- хотетьВключить тестовые случаи, и может пройти
go testЗапустите тест. - может пройти полностью
go buildдля компиляции (вместе с описанной ниже фичей называется "Go-available" - "go-gettable"). В частности, если вам нужно сгенерировать исходный код или метапрограммирование, используйтеgo generateи отправьте сгенерированные артефакты. - Первая часть пути, импортируемого через пространство имен, — это доменное имя, которое может быть сервером размещения кода или веб-службой, работающей на сервере. Код Go может найти исходный код и его зависимости, а также можетнормальная работа.
- Каждый каталог имеет только один пакет и может использоватьОграничения построения кодаДелайте условную компиляцию.
Документация по языковым инструментам GoОчень всеобъемлющий, это хорошая отправная точка для изучения того, как Go реализует различные экосистемы.
Другие инструменты
Стандартная библиотека языка Go содержитНекоторые пакеты, которые могут взаимодействовать с исходным кодом Goибиблиотека расширений x/tools с большей функциональностью. Язык Go также имеет очень сильную культуру разработки сторонних инструментов в сообществе (поскольку официальные лица очень хотят, чтобы сам язык Go оставался простым). Этим инструментам часто требуется знать расположение исходного кода, а также может потребоваться информация о типе.go/buildПакет следует соглашениям инструментов языка Go, поэтому сам по себе служит документацией для части процесса сборки. Недостатком является то, что инструменты, построенные на его основе, иногда несовместимы с кодом, основанным на других инструментах сборки. Поэтому естьНовый пакет находится в разработкеОн хорошо интегрируется с другими инструментами сборки.
На самом деле в Go много инструментов, и у каждого свои предпочтения. Но примерно так:
- Инструменты, разработанные командой разработчиков языка Go, имеют тот же цикл выпуска, что и язык Go..
- это содержитИнструмент автоматического форматирования кода,Инструмент покрытия тестами,инструмент отслеживания времени выполнения,Инструмент сбора информации,Статический анализатор распространенных ошибок,Устаревший инструмент обновления кода Go. Эти инструменты могут быть
go tool <cmd>команда для доступа. - Инструменты, поддерживаемые командой разработчиков Go, но не выпущенные вместе с языком Go..Инструмент для написания постов в блоге и инструмент для презентаций,Инструмент рефакторинга большого кода,Инструмент автоматической коррекции пути импортаиязыковой сервер.
- Сторонние инструменты — их слишком много. Существует множество списков сторонних инструментов, таких какэто.
Суммировать
Я хотел бы закончить этот пост кратким списком ссылок для начинающих, которые чувствуют себя потерянными. Пожалуйста, нажмите на ссылку ниже:
- Начать изучение языка Go.
- Понять, как работает язык Go.
- Что такое легальный код Go и почему.
-
Языковые инструменты Go и их документация, также через
go helpПроверять. Иногда задействован другой контент, вы также можете проверитьЭто недостаточно подробно. - Пишите код, соответствующий стандартам сообщества.
- проверить код.
- Найдите новые пакеты зависимостей или просмотрите документацию для распространенных пакетов..
Существует много ценной документации, дополняющей это, но этого должно быть достаточно, чтобы вы могли хорошо начать. Как новичок в Go, если вы обнаружите, что чего-то не хватает в этой статье (я мог бы добавить больше деталей) или если вы найдете какие-либо ценные ссылки, пожалуйста,Свяжитесь со мной в Твиттере. Если вы уже являетесь опытным разработчиком языка Go и обнаружите, что я упустил какой-то важный контент (но я намеренно пропустил некоторые важные справочные материалы, чтобы новички могли почувствовать свежесть изучения языка Go :smile:), пожалуйста, оставьте мне тоже сообщение.
[1]Примечание. В настоящее время команда разработчиков Go работает надмодульОбеспечьте некоторую поддержку. Модули — это единица распространения кода поверх пакетов. Эта поддержка включает в себя контроль версий и некоторые наработки, которые позволяют «традиционным» инструментам языка Go решать проблемы. К тому времени, когда эта поддержка будет завершена, все в этом абзаце будет по существу устаревшим. Поддержка модулейВ настоящее времяДа, но еще не часть языка Go. Поскольку ядром этой статьи является краткое введение в различные компоненты языка Go, они не подлежат изменению.СейчасЯ думаю, что также необходимо разобраться в этих исторических вопросах.
Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.