8 (800) 551-30-75

Скопировать

Бесплатно по России

info@appfox.ru

Скопировать

С 10:00 до 21:00

info@appfox.ru

Скопировать

С 10:00 до 21:00

Заполнить бриф

Онлайн заявка

info@appfox.ru

Скопировать

С 10:00 до 21:00

8 (800) 551-30-75

Скопировать

Бесплатно по России

Заполнить бриф

Онлайн заявка

#

Язык программирования Go

Редакция Appfox

Редакция Appfox

Время чтения: 10 минут

Язык программирования Go

Golang, или просто Go - компилируемый язык программирования со структурным уклоном и многопоточной системой обработки данных, разработанный сотрудниками компании Google. Среди конкурентов он выделяется достаточно высокой производительностью и относительной простотой синтаксиса. В отличие от объектно-ориентированных языков, в Go нет объектов и классов - программы строятся вокруг структур и методов.

Особенности Go

  1. Нестрогий синтаксис.
    Го нечувствителен к точкам с запятой в конце функций и другим синтаксическим правилам, как, например, С и С++. Компилятор автоматически может расставить нужные знаки. Такие послабления в среде разработчиков называются синтаксическим сахаром.
  2. Автоматизация управления памятью.
    Программисту нет необходимости следить за заполнением памяти и освобождать ее от лишних данных - за него это в автоматическом режиме делает так называемый сборщик мусора.
  3. Быстрое форматирование.
    Специальная команда gofmt “наводит порядок” в расположении строк - выравнивает колонки, расставляет отступы и т. д.
  4. Встроенные инструменты тестирования.
    В Golang множество ошибок - от несоответствия типов переменных до SQL уязвимостей и опасных хеш-функций - можно найти с помощью внутренних команд. Оператор golint выдает рекомендации по совершенствованию кода на основе официальной документации от разработчика языка.
  5. Применение функционального стиля.
    Go не ориентируется на ООП, поэтому довольно большое значение здесь уделяется функциям. В языке присутствуют замыкания, возврат значений функций, передача аргументов, не именованные функции и другие важные возможности.
  6. Предотвращение состояния гонки.
    Если функции в коде будут выполняться в неправильном порядке, это может привести к возникновению серьезной ошибки - состоянию гонки. Из-за случайного характера проявления она почти не поддается ручной локализации. Выявлять гонку помогают специальные инструменты, такие как детектор race в компиляторе.

Преимущества и недостатки языка

#

Среди плюсов Go можно отметить несколько пунктов.

  1. Высокая скорость работы.
    Go не уступает в производительности своим главным конкурентам - С и C++, при этом он потребляет меньше памяти. Обычно компиляция программы проходит буквально за несколько минут.
  2. Статическая типизация.
    Переменным в Golang при объявлении присваивается строгий тип. Такой подход предотвращает возникновение специфических ошибок. При этом для пользовательских типов возможна нестрогая (или на программистском сленге - утиная) типизация.
  3. Параллельные вычисления.
    Параллельные потоки, или горутины - это функции, которые выполняются одновременно. Они экономят потребляемую память и более равномерно тратят ресурсы процессора.
  4. Поддержка юникода.
    Строчный тип данных поддерживает работу с юникодом, содержащим символы большинства алфавитов мира.
  5. Широкая библиотека.
    В стандартной комплектации языка есть множество библиотек для веб и дескотоп разработки. Кроме того, для Go периодически появляются полезные сторонние библиотеки.
  6. Авторитетные разработчики.
    Язык разработан ключевыми сотрудниками Google - Робом Пайком и Кеном Томпсоном. Авторы Go учитывали все проблемы и текущие потребности инженеров крупных веб-сервисных систем, делая платформу максимально практичной и продуманной.

К недостаткам Golang специалисты относят следующие моменты.

  1. Отсутствие распространенных возможностей.
    В Go не работает ряд принципов, которые считаются стандартными для большинства ООП языков: наследование типов, перегрузка функций и операторов и пр. Такой подход выбран создателями языка сознательно, чтобы сделать код более эффективным и минимизировать побочные эффекты.
  2. Отсутствие типов с перечислениями.
    Такие типы в Go заменены группами констант, которые, по факту, являются целыми несвязанными числами и не контролируются компилятором. Например, невозможно создать цикл Switch с типом перечисления в качестве основного параметра выбора.
  3. Возврат ошибок вместо структурной обработки исключений.
    Множественные проверки ошибок загромождают код и усложняют его чтение.
  4. Сложность перехода с других технологий.
    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

Редакция Appfox