Содержание статьи
Этот материал открывает цикл статей, где я покажу возможности и особенности этого языка на живых примерах. Это не совсем руководство в духе «учимся программировать с полного нуля»: в начале я постараюсь понятно рассказать о самых основах, чтобы ты смог написать и понять простейшую программу, но дальше разбор сложных вещей на детсадовском уровне был бы слишком объемным. Поэтому постепенно перейдем на взрослые объяснения для тех, кто хоть немного видел другие языки программирования. Как далеко смогут протянуть новички — не уверен. Делись впечатлениями в комментариях!
Примеры будут по возможности перекликаться с реальными задачами. Однако, разумеется, эти примеры в чем‑то синтетические и во многом упрощенные. Мы не будем писать второй Metasploit с нуля, да и не сможем этого сделать.
Также я не ставлю перед собой цель переписать спецификацию языка или создать всеобъемлющий учебник по Go, научить тебя писать идиоматичный код с применением современных паттернов проектирования или рассказать, как отвечать на каверзные вопросы собеседований.
Моя основная цель — показать современный и необычный язык, который часто (и незаслуженно) обходят вниманием, считая нишевым или экстравагантным.
info
У Go есть и альтернативное название — Golang. Из‑за распространенности глагола to go в английском языке поисковые запросы со словом go зачастую приводят совсем не туда, куда хотелось бы. Поэтому, когда гуглишь что‑то, лучше использовать слово Golang.
Далеко ходить не станем и начнем с классического Hello, world:
package mainimport "fmt"func main() { fmt.Println("Привет, Хакер!")}
www
Все исходники ты можешь найти в моем репозитории.
Давай разберем построчно. Сначала объявляем пакет с именем main. Пакет в Go — это каталог с файлами, где каждый файл начинается со слова package и названия пакета.
Мы написали, что наш код включен в пакет main: если компилятор найдет в том же каталоге другие файлы с таким началом, то все их объединит. Нужно это, чтобы можно было разбить длинный код на отдельные смысловые части, но обращаться к переменным и функциям, заданным в других частях (в других языках такой механизм называется пространством имен — namespace).
Следующей строчкой мы импортируем пакет fmt, содержащий функции консольного ввода и вывода. Для его импорта, как и других пакетов из стандартной библиотеки, достаточно указать только имя. Для пакетов сторонних разработчиков потребуется указать источник, например github., потому что в Go нет центрального репозитория пакетов (при этом есть общий ресурс с документацией по пакетам).
Наконец, точка входа в приложение — функция main, не принимающая аргументов и не возвращающая значений.
Объявление любой функции в Go начинается ключевым словом func. Дальше идет название функции (main), пустые скобки (здесь могут быть аргументы, которые принимает функция, но main у нас ничего не принимает) и в фигурных скобках — тело функции.
Важный момент: открывающая фигурная скобка никогда не должна стоять в новой строке. В противном случае утверждение будет обработано неправильно и возникнет ошибка компиляции.
info
В C мы написали бы void , а в Go просто не указываем ничего.
Внутри main мы вызываем функцию Println из ранее импортированного пакета fmt: сначала fmt, затем точка, затем Println и в скобках (как ты уже знаешь, в них идет аргумент) — строка «Привет, Хакер!», которую мы хотим вывести в консоль. Строки, как и в большинстве языков, оборачиваются в двойные кавычки.
www
Я здесь не буду описывать синтаксис оформления вывода и альтернативные варианты функции — подробности ты найдешь в доках самостоятельно.
info
Пока что по синтаксису все привычно для тех, кто немного знаком с любым другим C-подобным языком. Но дальше встретятся некоторые особенности. Например, Go тоже использует точку с запятой как маркер окончания утверждения. Но, следуя парадигме минималистичности, Go не требует от программиста ставить точки с запятой и делает это сам. Отсюда и запрет на фигурные скобки в отрыве от объявления функции — иначе между ними вставилась бы точка с запятой.
История и особенности языка Go
Go был разработан внутри компании Google как собственная альтернатива C++ для применения в высоконагруженных сервисах. Разработчики — «звездная команда»: Роберт Гризмер (браузерный движок Google V8), Роб Пайк (Unix), Кен Томпсон (Unix, C). Первая версия представлена в 2009 году. Основная цель создания языка — всесторонне упростить и облегчить C++, не теряя в возможностях и скорости исполнения.
Главная особенность Go — лаконичность. В нем мало слов и понятий, порой даже слишком (так, помимо наследования и переопределения функций, в язык не включили и ternary operator, и даже enum). С другой стороны, в наличии автоматическое управление памятью и невероятно обширная стандартная библиотека.
Тебе не придется, как в C, на каждый чих изобретать свой велосипед из сотен строк — к твоим услугам куча возможностей, от парсинга JSON до ZIP-архивирования. При этом сохраняется простота и компактность. Никаких гигабайтных SDK и танцев с версиями сотен зависимостей в пакетном менеджере.
Среди сильных сторон Go обычно называют следующее:
- простота во всем — от изучения ключевых слов до поиска и подключения пакетов;
- легкость переиспользования кода;
- высокая скорость компиляции;
- компактный тулчейн;
- кросс‑компиляция под множество платформ и статическая линковка бинарников, исключающая необходимость таскать за собой зависимости;
- развитая система многопоточности с собственным планировщиком, ускоряющим работу и снижающим нагрузку на ОС.
Ты можешь возразить: разве многопоточность так уж редка в современных языках программирования? И будешь, конечно, прав. Но дело здесь в простоте и пороге вхождения. Толщина книжек «Java Concurrency на практике» пугает джунов, а о подводные камни периодически спотыкаются даже сеньоры. Тем временем Go изначально создавался как многопоточный язык, с максимальной прямолинейной и очевидной реализацией этого механизма.
На Go или с его использованием написаны такие известные инструменты, как Docker, Kubernetes, Terraform, Prometheus, Grafana. Для создания собственных сервисов Go используют в Google, Uber, Netflix, Dropbox, Twitch и множестве других компаний.
Наконец, если тебе интересно, как реализована та или иная фича языка, с Go ты без труда можешь заглянуть «под капот» — и сам язык, и стандартная библиотека распространяются по свободной лицензии, как и подавляющее большинство пакетов, созданных сторонними разработчиками.
Талисман языка Go — синий мультяшный суслик (англ. gopher).

Инструментарий
Давай разберемся, как вообще создавать и запускать программы. И здесь Go продолжает следовать парадигме минималистичности. Для разработки программ тебе потребуется единственный инсталляционный пакет под твою платформу, размером где‑то 60 Мбайт. Там есть все, что нужно для сборки программ под любую поддерживаемую ОС и архитектуру.
Я пока не говорил? Кросс‑платформенность — еще одна фишка Go, вариаций поддерживаемых платформ множество, от Windows до Solaris, от 386 до MIPS и POWER8. Все верно, для любой из них ты можешь собрать бинарник на своем компьютере без каких‑либо дополнительных инструментов и зависимостей.
Код можно писать хоть в блокноте или nano, но обычно используют более богатые возможностями среды: VS Code или, например, Zed. Есть и коммерческая IDE GoLand.
www
По неизвестной мне причине в популярный Notepad++ встроенную подсветку синтаксиса Go до сих пор не завезли. Выручают пользовательские стили, вот пример.
После установки мы можем воспользоваться консольной утилитой go.
В Linux:
mkdir hello && cd $_touch hello.go && nano $_# Скопипасти текст примера вышеgo run hello.go
В Windows:
mkdir hello
cd hello
notepad hello.go
:: Скопипасти текст примера выше
go run hello.go
Команда go собирает бинарник из указанного файла, помещает его во временный каталог и запускает, а после завершения работы — удаляет. Если же нужно сохранить собранный код, используй go (c ключом -o можно указать желаемое имя выходного файла).
В целом этого достаточно, чтобы писать и выполнять простые программы, использующие только средства стандартной библиотеки.
Кросс-компиляция
Цель сборки задается двумя переменными окружения: GOOS определяет операционную систему и GOARCH — архитектуру. Возможные комбинации можно увидеть, выполнив команду go .
К примеру, можем в Windows собрать бинарник для Linux ARM64 (например, Raspberry Pi):
set GOOS=linux&& set GOARCH=arm64&& go build -o hello_arm64
Обрати внимание на отсутствие пробелов после значений переменных.
Если же нужно из Linux собрать .exe для Windows, можем задать такие параметры:
GOOS=windows GOARCH=amd64 go build -o hello.exe

Прежде чем пойти дальше, познакомимся еще с одной важной концепцией — модулями. Модулем называют один или несколько пакетов, составляющих единое целое. Как правило, модуль — это отдельное приложение, и в таком случае он обязательно должен содержать один и только один пакет main, в котором находится одна функция main — она будет точкой входа в приложение.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
