Язык программирования Go (Golang)
Go (или Golang) — современный компилируемый язык программирования, созданный в компании Google для разработки быстрых, надёжных и масштабируемых приложений.
Сегодня Go широко применяется при создании веб-серверов, REST API, облачных сервисов, сетевых утилит и микросервисной архитектуры. Он сочетает высокую производительность языков C и C++ с простотой, характерной для Python.
Официальное название языка — Go. Название Golang не является официальным, однако широко используется в Интернете, чтобы избежать путаницы с английским словом go.
История создания
Работа над языком началась в 2007 году внутри компании Google. Его авторами стали три известных инженера:
- Роберт Гризмер (Robert Griesemer);
- Роб Пайк (Rob Pike);
- Кен Томпсон (Ken Thompson) — один из создателей операционной системы Unix.
Первая публичная версия языка была представлена в 2009 году. Главной задачей разработчиков было создать язык, который позволял бы писать большие серверные программы значительно проще, чем на C++, но при этом без потери производительности.
В Google огромные проекты содержат миллионы строк кода. Компиляция могла занимать десятки минут, а поддержка сложного кода требовала больших усилий. Go создавался как язык, который позволит уменьшить сложность разработки.
Почему появился Go
К моменту создания Go существовало множество популярных языков программирования, однако каждый из них имел свои недостатки.
| Язык | Основные достоинства | Недостатки |
|---|---|---|
| C | Очень высокая скорость работы | Ручное управление памятью |
| C++ | Высокая производительность | Очень сложный синтаксис |
| Java | Автоматическое управление памятью | Большой объём памяти и длительный запуск |
| Python | Простой и понятный код | Невысокая скорость выполнения |
Разработчики Go попытались объединить лучшие качества этих языков в одном проекте.
- простоту Python;
- скорость C и C++;
- автоматическое управление памятью, как в Java;
- встроенную поддержку многопоточности.
Создатели Go сознательно отказались от многих сложных возможностей, существующих в других языках. Благодаря этому язык оказался небольшим, легко изучается и остаётся достаточно простым даже в крупных проектах.
Главная идея языка
При разработке Go использовался очень простой принцип:
Лучше иметь небольшой набор простых возможностей, чем огромный набор сложных.
Именно поэтому в Go отсутствуют многие привычные конструкции, например наследование классов, перегрузка операторов или сложная иерархия типов. Вместо этого язык предлагает небольшое количество понятных механизмов, которых достаточно для решения большинства задач.
- Go разработан в компании Google.
- Первая версия языка вышла в 2009 году.
- Главные преимущества Go — простота, высокая скорость и встроенная поддержка конкурентного выполнения программ.
- Go особенно хорошо подходит для серверной разработки.
Где используется Go
Изначально язык Go разрабатывался для внутренних проектов Google, однако вскоре стал использоваться тысячами компаний по всему миру. Сегодня Go является одним из самых популярных языков для создания серверных приложений и облачной инфраструктуры.
На Go написаны многие известные проекты:
- Docker — система контейнеризации приложений;
- Kubernetes — платформа оркестрации контейнеров;
- Terraform — инструмент автоматического управления инфраструктурой;
- Prometheus — система мониторинга;
- Grafana Loki — система хранения и анализа логов;
- десятки веб-серверов, сетевых прокси и облачных сервисов.
Большинство перечисленных проектов постоянно обрабатывают тысячи или миллионы сетевых запросов. Для подобных задач очень важны скорость, небольшое потребление памяти и эффективная работа с большим количеством одновременно выполняющихся операций.
Основные преимущества Go
Популярность языка объясняется не только высокой скоростью работы. Go обладает рядом особенностей, которые значительно упрощают разработку.
| Преимущество | Что это даёт разработчику |
|---|---|
| Простой синтаксис | Язык можно освоить значительно быстрее, чем C++ или Java. |
| Быстрая компиляция | Даже крупные проекты собираются за считанные секунды. |
| Высокая производительность | Программы работают почти так же быстро, как написанные на C. |
| Сборщик мусора | Не нужно самостоятельно освобождать память. |
| Горутины | Позволяют легко выполнять множество задач одновременно. |
| Статическая компиляция | Обычно вся программа собирается в один исполняемый файл. |
Во многих случаях готовую программу на Go можно просто скопировать на другой компьютер и сразу запустить. Для этого не требуется устанавливать дополнительные библиотеки или виртуальную машину.
Первая программа на Go
Традиционно изучение любого языка начинается с программы, которая выводит на экран строку Hello, world!. Этот пример позволяет познакомиться с основной структурой программы.
package main
import "fmt"
func main() {
fmt.Println("Hello, world!")
}
После запуска программы на экране появится:
Hello, world!
Если у вас уже установлен Go, создайте файл main.go, скопируйте в него приведённую выше программу и выполните команду:
go run main.go
Если всё сделано правильно, в консоли появится сообщение Hello, world!.
Из каких частей состоит программа?
Несмотря на небольшой размер, первая программа уже содержит практически все основные элементы любого приложения на Go.
Разбор первой программы
На первый взгляд программа выглядит очень небольшой, однако она уже содержит несколько важных элементов языка Go. Разберём её построчно.
Пакет main
package main
Каждый файл на Go принадлежит некоторому пакету (package). Пакет — это набор файлов, объединённых общей функциональностью.
Если программа должна запускаться как самостоятельное приложение, она обязательно должна содержать пакет main. Именно он сообщает компилятору, что здесь находится точка входа в программу.
Пакет main используется только для исполняемых программ. Библиотеки обычно имеют собственные имена пакетов.
Подключение библиотек
import "fmt"
Любая программа может использовать готовые библиотеки. Для их подключения применяется оператор import.
В данном примере подключается пакет fmt (сокращение от format), содержащий функции для вывода информации на экран.
Если библиотек несколько, запись выглядит следующим образом:
import (
"fmt"
"time"
"math"
)
Go автоматически удаляет неиспользуемые импорты. Если подключить библиотеку и ни разу её не использовать, компилятор выдаст ошибку.
Функция main()
func main() {
}
Ключевое слово func используется для объявления функций.
Функция main() имеет особое значение — именно с неё начинается выполнение любой программы. После завершения функции main() программа заканчивает работу.
Позднее мы познакомимся с функциями, которые принимают параметры и возвращают результаты.
Вывод текста на экран
fmt.Println("Hello, world!")
Функция Println() выводит переданные ей значения в консоль и автоматически переводит курсор на новую строку.
Например:
fmt.Println("Привет!")
fmt.Println(25)
fmt.Println(true)
Результат работы программы:
Привет!
25
true
Функция Println() умеет выводить сразу несколько значений. Между ними автоматически вставляется пробел.
fmt.Println("Возраст:", 18)
Результат:
Возраст: 18
Комментарии
Комментарии — это части программы, которые предназначены для разработчиков и полностью игнорируются компилятором. Они помогают объяснить назначение кода.
Однострочный комментарий начинается с двух символов //.
// Это комментарий
fmt.Println("Hello")
Для комментариев, занимающих несколько строк, используется запись:
/*
Это
многострочный
комментарий
*/
Хорошие комментарии объясняют почему написан тот или иной код, а не просто пересказывают то, что и так очевидно.
Почему в Go нет точек с запятой?
Если вы раньше программировали на C, C++, Java или C#, то наверняка привыкли заканчивать каждую инструкцию точкой с запятой.
В Go это обычно не требуется.
fmt.Println("Hello")
fmt.Println("World")
Компилятор самостоятельно вставляет точки с запятой в тех местах, где они действительно необходимы. Благодаря этому код выглядит более чистым и компактным.
Измените программу так, чтобы она выводила три строки:
- Ваше имя;
- Ваш возраст;
- Ваш любимый язык программирования.
Используйте три отдельных вызова fmt.Println().
Переменные
Практически любая программа работает с данными. Это могут быть числа, текст, даты, результаты вычислений или информация, введённая пользователем. Для хранения таких данных используются переменные.
Переменная — это именованная область памяти, в которой хранится некоторое значение. Во время работы программы значение переменной можно изменять.
Представьте коробку с наклейкой Возраст. Внутри лежит число 18. Если через год заменить число на 19, сама коробка останется той же, изменится только её содержимое. Переменная работает похожим образом.
Объявление переменной
Самый полный способ объявления переменной выглядит так:
var age int = 18
Эта строка состоит из нескольких частей:
| Часть | Назначение |
|---|---|
| var | Объявление новой переменной. |
| age | Имя переменной. |
| int | Тип данных. |
| 18 | Начальное значение. |
После выполнения этой инструкции в памяти появится переменная с именем age, содержащая число 18.
Изменение значения
Значение переменной можно менять сколько угодно раз.
var age int = 18
age = 19
fmt.Println(age)
Результат выполнения:
19
При изменении значения слово var повторно писать не нужно. Переменная уже существует.
Краткая форма записи
В реальных программах чаще используется сокращённая запись:
age := 18
В этом случае компилятор самостоятельно определяет тип переменной. Такой механизм называется выводом типов (type inference).
Следующие две записи полностью эквивалентны:
var age int = 18
age := 18
Однако вторая запись короче, поэтому именно она встречается в большинстве программ на Go.
Оператор := можно использовать только при создании новой переменной. Если переменная уже существует, необходимо применять обычный оператор присваивания =.
Например:
age := 18
age = 19 // правильно
age := 20 // ошибка
Основные типы данных
Go поддерживает большое количество типов данных, однако начинающим достаточно знать четыре основных.
| Тип | Описание | Пример |
|---|---|---|
| int | Целые числа | 25 |
| float64 | Дробные числа | 3.14 |
| string | Текст | "Hello" |
| bool | Логические значения | true, false |
Рассмотрим каждый из них подробнее.
Целые числа
count := 15
year := 2026
Тип int используется для хранения целых чисел без дробной части.
Дробные числа
price := 19.95
pi := 3.1415926
Для хранения дробных чисел обычно используется тип float64.
Строки
name := "Alice"
city := "Новосибирск"
Строковые значения всегда заключаются в двойные кавычки.
Логические значения
isAdmin := true
isStudent := false
Тип bool может принимать только два значения: true (истина) и false (ложь).
Создайте четыре переменные:
- ваше имя;
- ваш возраст;
- ваш рост (дробное число);
- логическое значение, показывающее, являетесь ли вы студентом.
Выведите все четыре переменные с помощью функции fmt.Println().
Константы
Не все значения в программе должны изменяться. Например, число дней в неделе, количество месяцев в году или значение числа π остаются постоянными. Для хранения таких значений используются константы.
Константа объявляется при помощи ключевого слова const. После создания изменить её значение уже нельзя.
const pi = 3.1415926535
Можно явно указать тип данных:
const daysInWeek int = 7
Несколько констант удобно объявлять сразу:
const (
monday = 1
tuesday = 2
wednesday = 3
)
Попытка изменить значение константы приведёт к ошибке компиляции.
const pi = 3.14
pi = 3.1415 // Ошибка!
Арифметические операторы
Go поддерживает привычные математические операции.
| Оператор | Назначение | Пример |
|---|---|---|
| + | Сложение | 5 + 2 = 7 |
| - | Вычитание | 5 - 2 = 3 |
| * | Умножение | 5 * 2 = 10 |
| / | Деление | 10 / 2 = 5 |
| % | Остаток от деления | 11 % 3 = 2 |
Пример программы:
a := 12
b := 5
fmt.Println(a + b)
fmt.Println(a - b)
fmt.Println(a * b)
fmt.Println(a / b)
fmt.Println(a % b)
Результат выполнения:
17
7
60
2
2
При делении двух целых чисел дробная часть отбрасывается.
fmt.Println(7 / 2)
Результат:
3
Чтобы получить дробный результат, хотя бы один операнд должен иметь тип float64.
a := 7.0
b := 2.0
fmt.Println(a / b)
Результат:
3.5
Краткие арифметические операции
Очень часто необходимо увеличить или уменьшить значение переменной. Для этого существуют сокращённые формы записи.
x := 10
x += 5
x -= 2
x *= 3
x /= 4
Эти операции полностью эквивалентны следующей записи:
x = x + 5
x = x - 2
x = x * 3
x = x / 4
Для увеличения или уменьшения числа на единицу существуют специальные операторы:
count++
count--
Первый оператор увеличивает значение переменной на единицу, второй — уменьшает.
В отличие от C, C++ и Java операторы ++ и -- в Go являются инструкциями, а не выражениями. Их можно использовать только отдельной строкой.
x++
fmt.Println(x)
Следующая запись является ошибкой:
fmt.Println(x++)
Создайте две переменные со значениями 15 и 4. Выведите результаты:
- сложения;
- вычитания;
- умножения;
- целочисленного деления;
- остатка от деления.
После этого увеличьте первое число на единицу при помощи оператора ++ и снова выведите его на экран.
