Я уверен, что уже есть немало хороших статей на тему создания «Hello, world»-программ на языке Go (к примеру, погуглив, я нашёл статью на metanit.com, статью на Хабре, а также статью на digitalocean.com). Ну вот и я решил не быть исключением и написать свой вариант. Цели статьи преследую следующие — кратко познакомить читателя с языком и его историей, пройти основные шаги по настройке и установке основного инструментария Go-разработчика для первого старта, ну и, собственно, написать наш вариант «Hello, world» на Go.
Итак, здесь мы напишем нашу первую программу на языке программирования Go (или, как его ещё называют, golang). В настоящее время данный язык всё больше и больше набирает популярность среди начинающих и опытных разработчиков.
Прежде, чем мы приступим к настройке окружения и среды разработки для Go, давайте разберём некоторые отличительные особенности языка. Что он собой представляет и для чего его вообще придумали его авторы? Почему же разработчикам Go не хватало возможностей множества других популярных языков, таких как Java, C++, C, Python, Kotlin, Scala и многих-многих других?
Новый курс! Создание GUI-приложений на Go с помощью Fyne! #1 Создание первого приложения
Согласно Википедии, Go является компилируемым многопоточным языком программирования, который изобрели во всем известной компании Google. Из той же Википедии мы узнаём, что разработка языка началась в 2007 году, а официально он был представлен общественности в ноябре 2009 года. Одной из идей и предпосылок для создания языка, которые разработчики языка ставили перед собой, насколько я понял, являлась идея создать очень достойную замену существовавшим на то время языкам программирования — с учётом всех тех изменений в мире программного обеспечения и железа, которые происходили за последние десятилетия вместе с развитием и всей ИТ-индустрии. Процитирую слова Роба Пайка, одного из создателей Go: «Go был разработан для решения реальных проблем, возникающих при разработке программного обеспечения в Google».
Пожалуй, все ключевые особенности языка я тут перечислять не буду, вы сможете прочитать их сами на официальном сайте языка или других ресурсах, но отмечу здесь основной вывод, к которому пришёл лично я: создание языка Go — это довольно мощный вызов для всего мира разработки софта — хотя бы ввиду того, что язык Go нацелен извлечь всё то лучшее, что есть в широко распространённых языках, а также привнести свою изящную специфику и гибкость конструкций языка и учесть множество других нюансов и деталей, продиктованных требованиями современных реалий ИТ отрасли, которые не могли бы предоставить C/C++/Oberon/Pascal/Newsqueak/Smalltalk/и т.д. с той же грациозностью, с которой это вышло у Go. Подытоживая сказанное, Go — это современный, практичный язык программирования с легко читаемым кодом, поддержкой сборки мусора, чётким разделением интерфейса и реализации, а также множеством других удобных, долгожданных и так нужных многим программистам фич.
Официальный сайт языка доступен по ссылке https://go.dev/, и прежде, чем начинать писать нашу первую программу на Go, мы должны скачать с него официальный бинарный дистрибутив (или релиз) с компилятором, всеми необходимыми библиотеками и средой выполнения для Go. Найдите подходящий для вашей операционной системы релиз и воспользуйтесь инструкциями по установке с официального сайта языка. В моём случае я использую операционную систему Windows 10, поэтому процесс установки Go свёлся к принятию всех настроек по умолчанию, и детали установки я пропущу.
Первая программа на языке программирования Go — как начать программировать на go
Следующим шагом нам понадобится интегрированная среда разработки (или IDE, Integrated Development Environment) для написания наших программ на Go. В принципе ничто не мешает писать программы на Go просто в каком-нибудь удобном блокноте, без всякой специальной среды (например, в Notepad++), а потом просто компилировать написанный код вручную, но в целях удобства я бы всё же рекомендовал рассмотреть какую-то из популярных сред разработки — чтобы процесс разработки был не только полезен, но и приятен.
В поисках сред разработки для Go я нашёл очень занятную статью, на основе которой я и делал свой выбор в пользу конкретной IDE, поэтому также рекомендую её к прочтению (внимание, статья на английском).
Итак, среди возможных основных вариантов сред разработки программ на языке Go я выявил следующие:
- LiteIDE (официальный сайт) — бесплатная среда разработки для Go с поддержкой основных возможностей для разработки, сборки и отладки программ на Go.
- GoLand (официальный сайт) — среда разработки от компании JetBrains, с бесплатным 30-ти дневным периодом и поддержкой всех основных возможностей для разработки на Go.
- VSCode (официальный сайт и страница расширения) — плагин для известной среды разработки Visual Studio Code, позволяющий использовать все основные возможности для разработки программ на Go.
- Go-plus плагин для редактора Atom (ссылка на страницу плагина) — специальный плагин с поддержкой языка Go в популярном редакторе Atom. Аналогично другим вариантам — поддерживает основные функциональные возможности для разработки программ на Go.
- GoSublime (ссылка на Github) — это IDE-подобный плагин для редактора Sublime Text 3, который поддерживает интеграцию для большинства инструментов разработки Go/Golang.
- vim-go (ссылка на Github) — это бесплатный плагин для популярного кросс-платформенного Open Source редактора vim. Плагин обеспечивает языковую поддержку для Go в vim, основные особенности вы найдете на их странице на Github
Какую из вышеперечисленных сред использовать — это ваш выбор, но я решил поэкспериментировать для начала с LiteIDE, поэтому и в контексте статьи описание всех моих дальнейших действий приведу для данного варианта IDE.
Установив и запустив LiteIDE, мы увидим главное окно среды разработки, где нам нужно начать с создания нового проекта.
Выбираем в главном меню Файл → Создать. и выбираем шаблон с названием «Go1 Package Project». В качестве имени проекта я выбрал FirstApp (обратим внимание, что по умолчанию среда предлагает создать проект в каталоге пользователя и подкаталоге gosrc — мы оставим этот путь по умолчанию):
После нажатия на «OK» видим, что среда создала для нас файл FirstApp.go и предлагает его открыть, соглашаемся:
Далее нашему взору предстанет созданный файл-шаблон для нашей первой программы на языке Go:
Чтобы наполнить наш созданный файл чем-то значимым, обратимся к официальному туториалу на сайте языка Go, а именно к разделу Get started with Go. Там же мы можем увидеть «каркас» простейшего приложения на Go:
package main import «fmt» func main()
Разница с нашим файлом FirstApp.go в том, что пакет в нашем случае называется FirstApp, а не main.
Попробуем набрать руками этот простой пример программы, заодно проверим возможности LiteIDE в части подсказок при вводе текста программы. Можно видеть, что при наборе слова import среда выдаёт удобные подсказки — как в части самого ключевого слова import, так и для пакета «fmt»:
Также довольно симпатично выглядят подсказки редактора кода для доступных методов из пакета fmt, в нашем случае нам нужен метод Println:
Итак, набрав текст из примера с официального сайта языка, я немного изменил сообщение на «Здравствуй, мир!», и вышло следующее:
Теперь нам нужно проверить работу нашей программы, для этого попробуем выбрать в панели инструментов BuildAndRun (или нажать любую из комбинаций клавиш Ctrl+R; Ctrl+F7):
Язык программирования Go
Golang, или просто Go — компилируемый язык программирования со структурным уклоном и многопоточной системой обработки данных, разработанный сотрудниками компании Google. Среди конкурентов он выделяется достаточно высокой производительностью и относительной простотой синтаксиса. В отличие от объектно-ориентированных языков, в Go нет объектов и классов — программы строятся вокруг структур и методов.
Особенности Go
- Нестрогий синтаксис.
Го нечувствителен к точкам с запятой в конце функций и другим синтаксическим правилам, как, например, С и С++. Компилятор автоматически может расставить нужные знаки. Такие послабления в среде разработчиков называются синтаксическим сахаром. - Автоматизация управления памятью.
Программисту нет необходимости следить за заполнением памяти и освобождать ее от лишних данных — за него это в автоматическом режиме делает так называемый сборщик мусора. - Быстрое форматирование.
Специальная команда gofmt “наводит порядок” в расположении строк — выравнивает колонки, расставляет отступы и т. д. - Встроенные инструменты тестирования.
В Golang множество ошибок — от несоответствия типов переменных до SQL уязвимостей и опасных хеш-функций — можно найти с помощью внутренних команд. Оператор golint выдает рекомендации по совершенствованию кода на основе официальной документации от разработчика языка. - Применение функционального стиля.
Go не ориентируется на ООП, поэтому довольно большое значение здесь уделяется функциям. В языке присутствуют замыкания, возврат значений функций, передача аргументов, не именованные функции и другие важные возможности. - Предотвращение состояния гонки.
Если функции в коде будут выполняться в неправильном порядке, это может привести к возникновению серьезной ошибки — состоянию гонки. Из-за случайного характера проявления она почти не поддается ручной локализации. Выявлять гонку помогают специальные инструменты, такие как детектор race в компиляторе.
Преимущества и недостатки языка
Среди плюсов Go можно отметить несколько пунктов.
- Высокая скорость работы.
Go не уступает в производительности своим главным конкурентам — С и C++, при этом он потребляет меньше памяти. Обычно компиляция программы проходит буквально за несколько минут. - Статическая типизация.
Переменным в Golang при объявлении присваивается строгий тип. Такой подход предотвращает возникновение специфических ошибок. При этом для пользовательских типов возможна нестрогая (или на программистском сленге — утиная) типизация. - Параллельные вычисления.
Параллельные потоки, или горутины — это функции, которые выполняются одновременно. Они экономят потребляемую память и более равномерно тратят ресурсы процессора. - Поддержка юникода.
Строчный тип данных поддерживает работу с юникодом, содержащим символы большинства алфавитов мира. - Широкая библиотека.
В стандартной комплектации языка есть множество библиотек для веб и дескотоп разработки. Кроме того, для Go периодически появляются полезные сторонние библиотеки. - Авторитетные разработчики.
Язык разработан ключевыми сотрудниками Google — Робом Пайком и Кеном Томпсоном. Авторы Go учитывали все проблемы и текущие потребности инженеров крупных веб-сервисных систем, делая платформу максимально практичной и продуманной.
К недостаткам Golang специалисты относят следующие моменты.
- Отсутствие распространенных возможностей.
В Go не работает ряд принципов, которые считаются стандартными для большинства ООП языков: наследование типов, перегрузка функций и операторов и пр. Такой подход выбран создателями языка сознательно, чтобы сделать код более эффективным и минимизировать побочные эффекты. - Отсутствие типов с перечислениями.
Такие типы в Go заменены группами констант, которые, по факту, являются целыми несвязанными числами и не контролируются компилятором. Например, невозможно создать цикл Switch с типом перечисления в качестве основного параметра выбора. - Возврат ошибок вместо структурной обработки исключений.
Множественные проверки ошибок загромождают код и усложняют его чтение. - Сложность перехода с других технологий.
Golang — не интуитивный язык. В отличие от Ruby, построенном на принципе “наименьшего удивления”, некоторые вещи в Го могут работать не так, как этого ожидает программист. Речь идет о различающейся семантике присваивания типов, отличиях в операциях с массивами и срезами и о некоторых других вещах.
Применение и перспективы
Публичный релиз Go состоялся в 2012 году, и с тех пор платформа неуклонно набирает популярность во всем мире. Хоть Го и является языком общего назначения, чаще всего он используется для разработки серверных приложений. Скорость ответа сервера на Golang может достигать 10-20 мс в сравнении со стандартными 200 мс.
Еще одно распространенное применение Go — создание микросервисов, то есть приложений, состоящих из нескольких небольших независимо обрабатываемых сервисов.
В целом го хорошо подходит для выполнения сложных вычислений и построения больших, многопоточных систем. Но графический интерфейс программы на Golang, если в нем есть необходимость, обычно строится с применением сторонних инструментов вроде WinAPI или GTK.
Основы синтаксиса и примеры программ
Разберем основы построения программ на Golang.
Переменные
В Go существует 11 типов целочисленных переменных, а также комплексные, дробные, булевые и строковые переменные. Целые числа различаются наличием знака, объемом занимаемой памяти и системой счисления (например, byte используется для двоичных значений).
Объявленную переменную всегда необходимо использовать в коде, иначе компилятор выдаст ошибку.
Объявление переменной происходит через оператор var. В той же строке переменной можно присвоить значение.
var x int = 1
Если значение переменной известно в момент ее объявления, можно воспользоваться краткой записью.
x := 1
В Golang также есть массивы — последовательности элементов. Объявляются они так:
var numbers [5]int = [5]int
Здесь задан массив со строго определенным количеством элементов — 5. Массивы с неограниченным размером называются слайсами и объявляются немного по-другому.
var numbers []int = []int
В слайс можно “на ходу” добавлять новые элементы с помощью оператора append.
Условия и циклы
Условный оператор If в Golang работает стандартным способом. Рассмотрим базовый пример со сравнением двух чисел и выводом результата сравнения на экран.
package main func main() < x := 5 y := 10 if x < y < println(«икс меньше игрека») >else if x > y < println(«икс больше игрека») >else < println(«числа равны») >>
main — это основная функция программы, внутри которой прописываются все команды.
Цикл For в Go также прописывается стандартным для C-подобных языков образом.
package main func main() < for x:= 1; x >
При этом цикл можно задать и без счетчика шагов.
package main func main() < x := 5 y := 10 for x < y < x = x + 1 >println(x) >
В этом примере алгоритм будет выполняться, пока первое число не станет равным второму.
Если полностью опустить условие, получится бесконечный цикл. Прервать его можно командой break.
x := 0 for < println(«Бесконечный цикл») if x == 10 < break >i++ >
Здесь цикл закончится, когда x станет равным десяти.
Функции
Как и в других языках, функции в Go используются для быстрой вставки повторяющихся фрагментов кода.
Простая функция умножения прописывается до функции Main и затем выполняется в основном теле программы.
package main func Mlp(x, y int) int < return x*y >func main()
В функции можно прописать несколько действий и, соответственно, возвращать из них несколько значений.
Go routine
Горутины — это функции, которые могут выполняться процессором параллельно, то есть практически одномоментно. Обычная функция превращается в горутину при помощи команды go.
Горутины повышают производительность программы. На небольших отрезках кода в их применении нет практического смысла, но в масштабных системах, требующих вызова множества функций в короткий промежуток времени, их действие проявляется явно.
За запуск go routine в Golang отвечает специализированная библиотека. Она упрощает работу программиста по распараллеливанию потоков.
Каналы
Каналы используются для связи горутин и передачи значений. Они напоминают общее хранилище, куда можно вложить данные из одной горутины и передать их в другую.
Каждый канал имеет свой тип данных — числовой, строчный или любой другой.
Горутина может передавать данные только в пустой канал. При этом функция-отправитель блокируется, пока информация из канала не будет принята другой горутиной. В свою очередь, функция-получатель находится под блокировкой, пока канал остается пустым.
При определении канала указывается его имя и используемый тип данных. Создается канал через команду make.
strChannel := make(chan string)
Данные передаются в канал с помощью специального оператора
Источник: appfox.ru
Язык программирования Go
Go, также известный как Golang — это структурный, компилируемый язык программирования общего назначения. Его создатели — бывшие сотрудники известной IT-корпорации Google. Программисты ценят Golang за производительность и лаконичный синтаксис, заказчики ПО — за надежность кода и относительно быструю разработку. От C++, Python и других объектно-ориентированных языков Го отличает отсутствие классов и объектов. В нем используются структуры и функции.
Особенности языка
- Упрощенный синтаксис.
Программисту на Go не обязательно следить за расстановкой точек с запятой и прочими правилами синтаксиса. Компилятор сам об этом позаботиться. - Автоматизированная память.
От переполнения памяти программы на Го защищает сборщик мусора, в автоматическом режиме обрабатывающий нужные ячейки. За счет этого код пишется быстрее, чем на С++ или С#. - Легкое форматирование строк.
С помощью единственной команды gofmt можно привести строки программы к единому формату: выровнять отступы, выделить колонки и т. д. Команда gofix, в свою очередь, ищет устаревшие синтаксические конструкции, не соответствующие действующим нормам. - Доступные инструменты тестирования.
В Golang легко можно отслеживать несовместимость типов, перегруженные конструкции и прочие уязвимости. - Исключение состояния гонки.
В многопоточных системах функции могут исполняться в неверном порядке — это и называется состоянием гонки. Обычно такая ошибка проявляется случайно и с трудом поддается ручному отслеживанию. Локализовать проблему помогает флаг race, выставляемый на этапе компилирования или тестирования кода. - Функциональный стиль.
В Go место объектов и классов занимают функции. Они передаются в качестве аргументов и могут выступать в роли пользовательских типов данных. В языке также присутствуют замыкания и другие полезные фишки, связанные с функциональным стилем программирования.
Преимущества и недостатки Go
Golang обладает рядом объективных плюсов.
- Статическая типизация.
Для стандартных типов переменных Go использует строгое определение. Это значит, что, например, в изначально числовую переменную невозможно случайно записать строку и тем самым вызвать ошибку. В то же время динамическая типизация с присущей ей плюсами доступна для пользовательских типов переменных. - Высокая скорость обработки данных.
Go выделяется среди конкурентов рекордно коротким временем компиляции кода. При этом он занимает заметно меньше оперативной памяти, чем С++ и C#. - Поддержка параллельных потоков.
Функции-горутины в Go работают параллельно, равномерно распределяя ресурсы процессора. Механизм использования параллелей достаточно прост даже для новичков. - Работа с юникодом.
Го поддерживает все символы из Юникода, то есть фактически все алфавиты мира. - Большой спектр библиотек.
В стандартном Golang представлено множество библиотек для веб и десктоп разработки. Есть поддержка библиотек С и С++. Кроме того, язык активно пополняется качественными пользовательскими решениями. - Авторитет создателей.
Go создали инженеры-практики из компании Google — Роб Пайк и Кен Томпсон. При разработке языка они руководствовались принципами эффективности и устойчивости кода при использовании даже в самых крупных веб-системах. Сейчас Го активно поддерживается сообществом и развивается в соответствии с требованиями времени.
Как у любого языка программирования, у Go есть и свои минусы.
- Отсутствие возможностей ООП.
Несмотря на то что функции в Golang работают не хуже объектов и классов, многим разработчикам сложно перестроиться с ООП принципов на другой формат построения кода. Создателям языка пришлось отказаться от привычных подходов ради повышения производительности платформы. - Работа типов переменных с перечислениями.
Эти типы представлены в Go как независимые целочисленные константы, из-за чего возникают некоторые неудобства — например, при работе с циклом Switch. - Отсутствие структурной обработки исключений.
Постоянный возврат ошибок замедляет работу с кодом и отладку программ. - Затрудненный переход с других платформ.
В некоторых случаях Го работает по своей особенной логике, непривычной для программистов, освоивших до этого Python, Ruby или C++. Это касается семантики присваивания типов, операций с массивами и других вещей.
Где применяется Go
Благодаря своей высокой производительности, Go часто используется в создании крупных серверных приложений и многопоточных вычислительных систем. Скорость ответа сервера при программировании на Го достигает 10-20 мс против привычных для других языков 200 мс.
На Golang также нередко пишут микросервисные приложения — то есть программы, состоящие из небольших, формально независимых, но связанных между собой сервисов.
В целом Go считается языком программирования общего назначения. На нем можно создать и десктопную программу, и код для обработки исследовательских данных. Правда, интерфейс программы придется делать с помощью вспомогательных инструментов, например, WinAPI.
Основы программирования Golang
Разберем базовый синтаксис и особенности языка на конкретных примерах.
Объявление переменных и массивов
Всего в Golang предусмотрено 17 типов переменных. Из них 11 целочисленных, различающихся по загрузке памяти и используемой системе счисления. Кроме целых, в Го доступны дробные и комплексные числа, а также строки и логические переменные.
Значение переменной можно задать сразу во время объявления.
var a int = 1
Существует и краткая версия записи.
a := 5
Переменную можно объявить и без присвоения ей конкретного значения. При этом любая объявленная переменная должна быть использована в коде, иначе программа не скомпилируется.
По умолчанию числовым переменным присваивается значение 0, логическим — false, а строковым — пустая строка.
Последовательности элементов, или массивы, задаются следующим образом.
var array [3]int = [3]int
Краткая запись выглядит так.
array := [3]int
При объявлении массива обязательно указывается количество включенных в него значений и их тип.
В Го также существуют слайсы — массивы со свободным количеством элементов.
var array []int = []int
Размер слайса может меняться при необходимости.
Условия и циклы
If — базовый оператор условия для любого языка программирования. В Го он работает по привычной всем разработчикам схеме.
Возьмем пример со сравнением двух чисел.
package main func main() < a := 2 b := 4 if a < b < println(«a меньше b») >else if a > b < println(«икс больше игрека») >else < println(«числа равны») >>
Кроме условия If, в коде примера обозначена главная функция программы — main.
В цикле For также нет ничего сложного.
package main func main() < for a:= 1; a >
Здесь мы выводим на экран числа от 1 до 10.
Цикл может быть и бесконечным. Прервать бесконечную обработку позволяет команда break.
package main func main() < a := 0 for < println(«Бесконечный цикл») if a == 10 < break >a++ > >
Функции
Можно сказать, что на функциях строится основная часть кода в Golang. Функции используются для быстрой вставки одинаковых фрагментов программы и экономии времени. Рассмотрим самый простой пример — функцию сложения. Прописав ее один раз, перед основной функцией, мы можем выполнить операцию сложения в любой момент с любыми аргументами.
package main func Sum(x, y int) int < return x+y >func main()
В функцию можно добавить несколько действий и получить все необходимые значения.
package main func SumAndSub(a, b int) (int, int) < return a + b, a — b >func main()
Go routine
Горутины — это параллельно, то есть одновременно, выполняемые процессором функции. Обычную функцию можно превратить в горутину с помощью оператора go.
Горутины применяются для ускорения работы серверов при выполнении объемных многопоточных программ. Разработчику не приходится самостоятельно следить за распараллеливанием — за него это делает специальная библиотека. Ресурсы процессора при этом расходуются максимально равномерно.
Каналы
Каналы позволяют независимым горутинам передавать друг другу хранящиеся в них данные. По сути, каналы используются как буфер обмена внутри программы.
Каждый канал принимает и передает только заранее определенный тип данных — числовой, логический или строчный.
Для предотвращения ошибок в каналах предусмотрены блокировка и очередь. Данные передаются строго в пустой канал. На функцию-отправитель накладывается блок, пока принимающая горутина не считает отправленную информацию. При этом функция-получатель блокируется, пока канал пуст.
Синтаксис каналов выглядит так.
intChannel := make(chan int)
Источник: app-android.ru