Golang linux или windows

Кросс-компиляция в Go

Несмотря на то, что кроссплатформенность стала фактически стандартным атрибутом практически всех современных языков и библиотек, создавать по-настоящему кроссплатформенный продукт, всё равно было непросто. Компилируемые языки и сопутствующие библиотеки требовали сложной установки и настройки среды сборки и библиотек, а интерпретируемые — обязывали иметь или деплоить в составе необходимую версию интерпретатора. Есть немало проектов, пытающихся сделать этот процесс чуть более простым, но зачастую единственным решением оставалось устанавливать отдельный сервер и компилировать нативно.

В Go кросс-платформенность вышла на тот уровень, когда впервые можно смело отказаться от compile farms, специально настроенных dev-сред, виртуальных машин для сборки или chroot/docker-dev решений. И это ещё один серьезный game-changer, подробнее о котором я и хочу рассказать и показать на примерах
Поехали.

Как известно, в Go сознательно отказались от динамической линковки — по ряду причин, основная из которых очень схожа с обычным объяснением дизайна почти любого аспекта Go — «преимущества [динамической линковки] намного меньше её недостатков и сложности, которая она привносит в архитектуру». Что ж, главной причиной появления dynamic linking было желание экономить ресурсы — прежде всего диcковое пространство и память — которые сейчас достаточно дешевы, не только на серверах, но и в embedded-устройствах (коптеры, к примеру, несут на борту уже по 1-2 Гб RAM!). Вобщем, перечислять плюсы и минусы отдельного способа линковки — это потянет на отдельный пост, так что пока просто принимаем, как есть — в Go на выходе всегда имеем статический бинарник.

На данный момент для актуальной версии Go 1.4.1 реализована поддержка следующих платформ:

  • Linux 2.6 1 и выше — amd64, 386, arm
  • MacOS X 10.6 и выше — amd64, 386
  • Windows XP и выше — amd64, 386
  • FreeBSD 8 и выше — amd64, 386, arm
  • NetBSD — amd64, 386, arm
  • OpenBSD — amd64, 386
  • DragonFly BSD — amd64, 386
  • Plan 9 — amd64, 386
  • Google Native Client — amd64p32, 386
  • Android — arm

1 — официально поддерживаются ядра 2.6.23 и выше, но в реальности всё работает и на более ранних ядрах ветки 2.6 — к примеру немало людей используют Go на RHEL5/CentOS5 с 2.6.18.

В Go 1.5 ожидается поддержка iOS.
Еще примечательно, что изначально поддержки Windows в Go не было — команда маленькая, и пачкать руки заниматься имплементацией кода для Windows было некому, но благодаря тому, что проект открыли для open-source разработки — порт для Windows был очень быстро написан сторонними людьми и интегрирован в официальную кодовую базу.

Хотя описанные далее процессы будут абсолютно одинаковы для всех платформ (за исключеним, разве что, Android и Native Client (NaCl), для которых нужны лишние телодвижения), далее в статье будет по-умолчанию считаться, что вы используете одну из трех самых популярных десктопных платформ — Linux, MacOS X или Windows. Кроме того, для большей простоты я буду подразумевать, что мы пишем и используем исключительно Go-код, без необходимости линковаться с С-библиотеками (и, тем самым, без необходимости использовать cgo/gcc). Есть еще отдельный кейс — когда нужно использовать ряд функций из стандартной библиотеки, завязанных на cgo, но об этом я напишу отдельной главой в конце.

Подготовка toolchain

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

Переходим в директорию с исходным кодом Go (она же $GOROOT/src, она же всегда есть у вас на машине) и пересобираем под нужную платформу, скажем Windows/amd64:

Процесс занимает на Macbook Air 2012 около 26 секунд. Скрипт make.bash — это стандартный скрипт сборки Go, которым бы вы инсталлировали Go, если бы ставили из исходников. Он собирает, собственно, Go, и всю стандартную библиотеку, только в этот раз — для платформы windows/amd64.
Также, по упомянутой выше причине, мы отключили поддержку CGO.

Значения GOOS и GOARCH

Таблица значений GOOS (если кто знает, как на Хабре сделать таблица в 50% ширины — подскажите):

OS $GOOS
Linux linux
MacOS X darwin
Windows windows
FreeBSD freebsd
NetBSD netbsd
OpenBSD openbsd
DragonFly BSD dragonfly
Plan 9 plan9
Native Client nacl
Android android

И GOARCH:

Architecture $GOARCH
x386 386
AMD64 amd64
AMD64 с 32-указателями amd64p32
ARM arm

Пример 1. Веб-сервер, написанный и собранный в Linux для Windows

Напишем простенький веб-сервер, который в Go писать проще, чем в некоторых языках/библиотеках парсить командную строку.

И соберем его для Windows 32- и 64-bit:

Думаю, не нужно говорить, что оба бинарника готовы к копированию на целевую Windows-систему и будут работать.

Пример 2. Кросс-компиляция под ARM для телефона Nokia N9

Сразу скажу, что сейчас я с embedded-девайсами плотно не работаю, поэтому могу какие-то детали не знать — так что постараюсь не углубляться в эту тему, но в целом за ситуацией с Go на embedded слежу. Вообще говоря, Go не позиционировался как язык для embedded-платформ, что, впрочем, не помешало народу активно начать его использовать в этой области. Возможно, причина в том, что embedded-индустрия сделала скачок вперед, и теперь «встраиваемое» устройство уже не означает критически малое количество ресурсов, а возможно компромиссы не в пользу экономии памяти в Go оказались гораздо менее ощутимыми на практике, но факт есть факт — для Go уже создано масса проектов вроде Gobot (robotics-фреймворк для целой кучи платформ — от Arduino, Raspberry PI и Beaglebone Back до LeapMotion, Pebble и ArDrone) или EMBD (фреймворк для работы с hobby-бордами), а PayPal уже пару лет использует Go в своем beacon-девайсе для беспроводных чекинов и платежей.

Читайте также:  Ошибка компонента службы теневого копирования томов 0х80042302 windows 10

Для примера возьмем Nokia N9 (или N950, кому повезло) — и соберем вышеприведенный пример для него:

Вот так просто, да.

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

Автоматизируем процесс

Казалось бы, что может быть проще указания одной переменной перед go build. Но есть ситуации, когда код нужно собирать и деплоить на разные платформы по 100 раз в день. Для таких задач есть несколько проектов, для автоматизации процессов подготовки toolchain-ов и, непосредственно, сборки кода под нужную платформу.

Ссылка: github.com/mitchellh/gox
Инсталляция и подготовка сразу всех возможных toolchain-ов:

Теперь, вместо «go build», пишем «gox»:

Можно указывать конкретный пакет или конкретную платформу:

Остальные аргументы командной строки идентичны go build. Достаточно интуитивно.

GoCX — это один из самых известных врапперов вокруг фич кросс-компиляции, но с упором на пакаджинг (умеет делать .deb даже) и различные плюшки для автоматизированных сборок. Сам не пользовал, поэтому, кому интересно, смотрите сайт и документацию.
github.com/laher/goxc

Разбираемся с CGO

Если кто-то смотрел видео с конференции GopherCon 2014, которая проходила прошлой весной в Денвере, то, возможно, помнит выступление Alan Shreve «Build Your Developer Tools in Go» — и одну из вещей, которую он говорит достаточно категорично: «не используйте кросс-компиляцию, компилируйте нативно». Дальше идет объяснение — причина в Cgo. Если вам не нужно использовать cgo — все окей. И на самом деле, очень малая часть очень специфичного кода в Go нуждается в сторонних С-библиотеках. В чем же проблема?

Проблема в том, что некоторые функции стандартной библиотеки зависят от cgo. Тоесть, если мы собираем Go с CGO_ENABLED=0, они просто не будут доступны и на этапе компиляции мы получим ошибку. Несмотря на то, что тут есть очень удобный и красивый workaround, давайте разберемся, что же именно в стандартной библиотеке зависит от cgo.

К счастью, сделать это просто:

Вкратце пройдемся по этим файлам:

  • crypto/x509/root_cgo_darwin.go — имплементирует одну функцию для получения корневых X.509 сертификатов в MacOS X. Если вы не используете явно эту фичу — ничего страшного, без cgo у вас все будет работать.
  • net/cgo_android/linux/netbsd/openbsd/cgo_unix_test.go — код необходимый для использования нативного DNS-резолвера в разных unix-ах. Чуть ниже подробности.
  • os/user/lookup_unix.go — функции из пакета os/user — для получения информации о текущем юзере (uid, gid, username). Используется getpwuid_r() для чтения passwd-записей
  • runtime/crash_cgo_test.go — файл с тестами для хендлинга крешей, ничего релевантного

Теперь подробнее про DNS-resolver.
Каждый файл из того списка (который скомпилируется только для своей платформы благодаря тегам // +build) содержит имплементацию единственной функции cgoAddrInfoFlags(), которая, в свою очередь, используется в cgoLookupIP(), которая, используется в dnsclient_unix.go, в котором мы находим функцию goLookupIP(), которая служит fallback-вариантом при отсутствии cgo-enabled кода, и тут же находим объяснение:

// goLookupIP is the native Go implementation of LookupIP.
// Used only if cgoLookupIP refuses to handle the request
// (that is, only if cgoLookupIP is the stub in cgo_stub.go).
// Normally we let cgo use the C library resolver instead of
// depending on our lookup code, so that Go and C get the same
// answers.

goLookupIP фактически резолвит только по Hosts-файлу и по DNS-протоколу, что для большинства систем — ок. Но могут быть проблемы, если в системе будут использоваться нестандартные методы резолвинга имён. Полагаю, что в 99% случаев, hosts и dns будут более, чем достаточно.

В сухом остатке имеем — если ваш код не использует С/С++-библиотеки через Cgo, и не использует следующие две вещи:

  • проверку x.509 сертификатов, которая должна работать на MacOS X
  • гарантированно получать системную информацию о текущем юзере

то на все заморочки с Cgo можно забить.

Первая часть (с X.509) на самом деле не такая уж редкая. Если я правильно понимаю — этот код нужен, если ваша программа использует стандартный net/http.StartAndListenTLS() — и вы используете реальные сертификаты, которые реально нужно проверять.

Поэтому вкратце о простом workaround вокруг этой темы — называется он gonative, и делает одну простую вещь — скачивает с официального сайта бинарные версии golang нужной версии для нужной платформы, в которой уже есть скомпилированные бинарники всех стандартных пакетов и, фактически, завершает процесс «собрать toolchain с cgo-кодом».
Всё что нужно сделать, это установить её (go get github.com/inconshreveable/gonative) и выполнить одну простую команду:

Читайте также:  Что такое linux like системы

И дальше использовать стандартные процедуры кросскомпиляции, как и раньше, ручками или через gox/gocx.
Подробнее о gonative тут: inconshreveable.com/04-30-2014/cross-compiling-golang-programs-with-native-libraries

Практическое применение

Теперь о главном — применении на практике. Я использовал в продакшене пока только три схемы — «сборка на darwin/amd64 -> деплой на linux/386», «linux/amd64 -> linux/386» и «linux/amd64 -> windows/amd64». Это продукты, которые уже больше года полноценно работают. Третий случай (деплой на windows) тогда меня вообще застал врасплох — был сервер, успешно бегущий на Linux, и тут вдруг резко понадобилось его запускать на Windows. Причем «вот срочно надо». Вспоминая бессонные ночи опыта с кросс- — да что там кросс, просто с компиляцией Qt для деплоя на Windows — 60-секундный процесс «гуглим как это делается → сборка toolchain → перекомпиляция проекта → деплой на windows» — стал просто шоком, я тогда даже не поверил глазам.

Но тут возникает следующий момент — раз кросс-компиляция и деплой становятся такими простыми и быстрыми, появляется стимул все зависимости от файлов — будь-то конфиги, сертификаты или что угодно еще — встраивать в бинарник тоже. Впрочем, это достаточно простая задача, даже для сторонних библиотек, благодаря эффективному использованию io.Reader интерфейса и пакету go-bindata, но это уже тема для отдельной статьи.

Надеюсь, ничего из главного не упустил.
Но в целом это на самом деле очень существенная разница со всем предыдущим опытом кросс-сборки. Если честно, я до сих пор не привык к этой перемене. Больше не нужны виртуалки с настроенной dev-средой, не нужны докер-имиджи для сборки — да вообще dev-environment отпадает как таковой. Это слишком резкий game changer, чтобы так быстро привыкнуть.

Источник

Изучение Golang в 2021 году: почему это просто, интересно и выгодно

Изучение Golang в 2021 году: почему это просто, интересно и выгодно

В сообществах программистов и на профильных сайтах всё чаще можно встретить статьи и материалы про изучение Golang. Чем же так хорош этот язык программирования и по какой причине всё больше компаний переводят на него свои продукты и решения?

Почему изучение Go — это просто и интересно

Golang (Голанг или сокращённо Go) — это относительно новый компилируемый многопоточный язык программирования. Он разработан в недрах великой и всемогущей компании Google и уже одно это заставляет присмотреться к нему повнимательней. Официально язык программирования Go был выпущен в 2009 году.

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

Простота этого языка даёт ему много других преимуществ:

  • лёгкость изучения — Golang разработчики сообщают, что на начальном уровне его можно выучить за выходные;
  • надёжность — в Go встроена «защита от дурака», запрещено всё потенциально опасное и используется строгая статическая типизация, отсутствуют классы и не используется наследование;
  • возможность автоматизации разработки — для Golang очень просто писать генераторы кода, статистические анализаторы, юнит-тесты: «Практически недостижимое для C++ разработчика 90% покрытие кода юнит-тестами становятся чем-то банальным при работе с Go»;
  • эффективность командной разработки — строгий подход к форматированию помогает стандартизировать код, упростить рефакторинг приложений;
  • упрощение документирования — простой код легче документировать, в Go есть готовые инструменты для создания документации;
  • универсальность — Golang программисты охотно создают для этого языка готовые библиотеки и фреймворки, которые можно использовать для разработки приложений.

Изучать Go интересно, прежде всего, потому что этот простой язык позволяет делать очень сложные вещи. В Golang можно быстро написать высоконагруженное, многопоточное, кроссплатформенное приложение. Создатель языка Роб Пайк сказал: «Этот язык разработали люди, которые пишут, читают, отлаживают и поддерживают большие системы».

Что касается синтаксиса, то Go чем-то похож на С, Pascal, Python и скриптовые языки. Когда читаешь программы на Go, возникает впечатление, что разработчики взяли от каждого языка всё самое лучшее и убрали всё лишнее и тяжеловесное. Читать и писать код на языке программирования Golang легко и приятно даже новичку. Вот пример кода простейшей программы для выманивания кота из-под дивана:

Сами Golang разработчики считают этот язык эффективным и лаконичным. Для них Go — это и язык, и идея. Но, согласитесь, что выбирать язык программирования только за его лаконичность и красоту было бы неправильно — важны также его универсальность и перспективность.

Почему Golang — это универсальный язык

Google создавала язык Golang для разработки приложений в своей гигантской сетевой инфраструктуре. Поэтому основные ниши использования языка Go — это сетевые приложения веб-сервисы и бэкенды. Но этим применение Go программирования не ограничивается.

Утилиты и микросервисы

На Go удобно и комфортно писать консольные утилиты, микросервисные приложения для распределённых систем. Go со своей кроссплатформенностью подходит и для написания пользовательских приложений.

Приложения для DevOps

Всё чаще Golang программирование используют в DevOps. На нём можно создавать удобные и мощные приложения для решения задач, связанных с обработкой больших объёмов данных. Его применяют для анализа статистики, обработки данных, создания различных парсеров, для блокчейн-проектов. Go отлично подходит для разработки во всех этих сферах благодаря удобству распараллеливания потоков и нетребовательности к ресурсам.

Читайте также:  Viewcam для windows 10

Быстрые и эффективные версии медленных приложений

В последние годы наметилась интересная тенденция — многие компании переводят свои сервисы с другого языка (например, Python) на Go. Причина в том, что приложения на Go работают быстрее, являются более производительными и менее требовательны к аппаратным ресурсам. При этом код на Go легко писать, модифицировать и обслуживать. Golang уже используется в компаниях: Яндекс, ВКонтакте, IBM, Intel, Adobe, Mail.ru Group, Avito, Ozon, Lamoda, BBC, Uber, Dropbox, Netflix и Twitter. Согласитесь, что этот список работодателей, к которым может устроиться Golang разработчик, выглядит очень внушительно. Некоторые компании организуют обучение Go для новых сотрудников.

Финансы и облачные вычисления

Интересно, что по результатам исследования JetBrains, в 2020 году большая часть программистов Golang помимо очевидной сферы IT-услуг работала в сфере финансовых технологий и облачных вычислений. Банки всё активнее используют Go в разработке приложений для своей инфраструктуры.

От 3D-движков до вирусов

На Golang написаны хорошо знакомые нам инструменты: Docker и Kubernetes. На GitHub можно найти множество интересных приложений на Go: от 3D-движка до библиотеки машинного обучения. На Golang написаны сетевая платформа Consul и система мониторинга событий Prometheus. Часто Golang разработка применяется в создании сложных систем как дополнительный инструмент наряду с другими языками программирования. Ну а уж когда на Go написали червь FritzFrog, то всем стало ясно, что Golang — это всерьёз и надолго.

Интересно, что за последние несколько лет количество вирусов на языке Go увеличилось примерно на 2000%.

Golang шаг за шагом отвоёвывает позиции у таких монстров индустрии, как JavaScript, Python и C++. По данным GitHub, язык Go в первом квартале 2021 года находился на 5 месте по популярности среди разработчиков. Почему же всё больше как молодых, так и опытных специалистов идут на курсы Golang? Что так привлекает разработчиков в Go, помимо его красоты и эффективности? Спойлер: им весьма неплохо платят.

Почему изучение Golang — это выгодно и перспективно

Согласно исследованию сайта Работа.ру, на момент написания статьи средняя зарплата Go разработчика по Москве составляет 195 000 Руб, а по России — 165 000 Руб. Максимальная зарплата по России — 290 000 Руб. Выводы аналитиков однозначны: «Таких профессионалов пока очень мало, поэтому они востребованы и получают высокие зарплаты. Найти работу можно в любой крупной компании, связанной с IT-сферой».

По данным центра профориентации ПрофГид, в Go программистах заинтересованы веб-агентства, аутсорсинговые IT-компании, крупный бизнес. Среди Go разработчиков сейчас наблюдается невысокая конкуренция — специалистов мало, а спрос на них высок. Это значит, что найти хорошую, высокооплачиваемую работу им проще, чем многим другим программистам.

По исследованиям hh.ru, в 2020 году прирост количества вакансий по Go в 2020 году составил 45% по сравнению с предыдущим годом. Востребованность Go растёт каждый год. Программистов на Golang тоже с каждым годом становится всё больше. По некоторым данным, около 1,1 миллиона профессиональных разработчиков используют Go как основной язык. 2,7 миллиона — если учитывать тех, кто использует его в дополнение к другому языку. В России насчитывается около 35 тысяч Go разработчиков.

Golang входит в десятку основных языков разработки, на GitHub в первом квартале 2021 года он занимает 5 место по популярности. Аналитики считают, что в ближайшие годы доля Go достигнет 15–20%. По результатам опросов, всё больше разработчиков собираются перейти на Go. Так что сейчас подходящее время начинать изучать Golang.

Как стать Golang программистом

Учить Go очень просто. Проще, чем, например, язык C++. Эксперты называют Golang языком «с низким порогом вхождения». Это значит, что разобраться в нём несложно даже при отсутствии базовой подготовки.

Если вы решили изучить программирование на Go с нуля, то можно начать с официального руководства. Дальше можно продолжить учить Golang разными способами: разбирать примеры, читать книги или смотреть видеоуроки.

Но нужно помнить, что кроме самого языка (базового синтаксиса, стандартных библиотек, практик разработки) начинающему разработчику понадобится изучить ещё много смежных вопросов:

  • основы веба — HTML, CSS и базовые знания по JavaScript;
  • основы работы в Linux — командная строка, файловая система, bash;
  • работа в Git;
  • работа с реляционными БД (например, PostgreSQL);
  • принципы Backend-разработки;
  • основы разработки микросервисов.

Без всего этого бэкграунда будет сложно писать серьёзные приложения.

Обычно самым эффективным считается изучение языка на курсах. Например, на курсе «Разработка на Go» от GeekBrains. Ведь только так в процессе изучения Golang можно заодно разобраться со всеми нужными технологиями — изучить их все вместе на конкретных примерах, а не каждую по отдельности.

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

В общем, у начинающего разработчика сейчас есть множество заманчивых и перспективных возможностей — можно выбирать не только «свой» язык программирования, но и способ его изучения. Главное — подойти к вопросу вдумчиво и системно, тогда всё получится!

Источник

Оцените статью