Оглавление
Время чтения: 10 минут
Язык программирования 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{1,2,3,4,5}
Здесь задан массив со строго определенным количеством элементов - 5. Массивы с неограниченным размером называются слайсами и объявляются немного по-другому.
var numbers []int = []int{1,2, 3}
В слайс можно “на ходу” добавлять новые элементы с помощью оператора 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 <= 10; x++ {
println(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() {
a:=Mlp(2,3)
b:=Mlp(4,5)
println(a)
println(b)
}
В функции можно прописать несколько действий и, соответственно, возвращать из них несколько значений.
Go routine
Горутины - это функции, которые могут выполняться процессором параллельно, то есть практически одномоментно. Обычная функция превращается в горутину при помощи команды go.
Горутины повышают производительность программы. На небольших отрезках кода в их применении нет практического смысла, но в масштабных системах, требующих вызова множества функций в короткий промежуток времени, их действие проявляется явно.
За запуск go routine в Golang отвечает специализированная библиотека. Она упрощает работу программиста по распараллеливанию потоков.
Каналы
Каналы используются для связи горутин и передачи значений. Они напоминают общее хранилище, куда можно вложить данные из одной горутины и передать их в другую.
Каждый канал имеет свой тип данных - числовой, строчный или любой другой.
Горутина может передавать данные только в пустой канал. При этом функция-отправитель блокируется, пока информация из канала не будет принята другой горутиной. В свою очередь, функция-получатель находится под блокировкой, пока канал остается пустым.
При определении канала указывается его имя и используемый тип данных. Создается канал через команду make.
strChannel := make(chan string)
Данные передаются в канал с помощью специального оператора <-
IntChannel <- 10
Пакеты
В начале каждой программы-примера мы прописывали команду package. Она, по сути, именовала новый файл - или пакет. Функцию из одного пакета можно вызвать для исполнения в другом, просто указав для нее правильный путь. Правда, вначале для этого придется импортировать нужный файл через команду import.
Стандартная библиотека Go включает в себя множество полезных пакетов - для форматирования текстов, работы с командной строкой и пр.
Работа с пакетами упрощает сборку больших программ, состоящих из различных смысловых частей.
Заключение
Язык Go предназначен для разработки высокопроизводительных многопоточных систем. Его авторы старались совместить преимущества других популярных языков - C, C++ и Python, и в целом им это удалось. Программисты ценят Golang за понятный синтаксис и удобную структуру. Для заказчика проекта платформа гарантирует стабильно работающий продукт при любых масштабах развертывания.
В студии AppFox можно подать заявку на программирование, создание игр или заказать разработку приложений https://appfox.ru и получить бесплатную консультацию по ценам и услугам.