Go (язык)
| Класс языка | императивный, конкурентный, со статической типизацией |
|---|---|
| Появился в | 2009 |
| Авторы | Роберт Гризмер, Роб Пайк, Кен Томпсон |
| Разработчик | |
| Выпуск версий | дважды в год (февраль и август) |
| Типизация | статическая, строгая, структурная для интерфейсов |
| Управление памятью | сборка мусора |
| Расширение файлов | .go |
| Лицензия | BSD-3-Clause |
| Сайт | go.dev |
Go (часто Golang — по старому домену golang.org) — компилируемый язык программирования со статической типизацией и сборкой мусора, созданный в Google. Он задуман как простой язык для больших команд и больших кодовых баз: быстрая компиляция в один исполняемый файл без зависимостей, встроенная конкурентность и минимум синтаксических конструкций. На Go написаны многие ключевые инструменты облачной инфраструктуры — Docker, Kubernetes, Terraform, Prometheus, etcd, Caddy.
История
Работу над языком в 2007 году начали Роберт Гризмер, Роб Пайк и Кен Томпсон (соавтор Unix и языка B). По их словам, толчком стало раздражение от долгой сборки больших программ на C++ и сложности существующих языков.[1] Go был представлен публично 10 ноября 2009 года как проект с открытым исходным кодом.
Версия Go 1.0 вышла в марте 2012 года вместе с обещанием совместимости: программы, написанные для Go 1, должны продолжать компилироваться и работать во всех последующих версиях 1.x.[2] Это обещание соблюдается до сих пор и стало одной из причин популярности языка в продакшене.
Важные вехи: компилятор, переписанный с C на сам Go (1.5, 2015), модули для управления зависимостями (1.11, 2018), обобщённые типы — дженерики (1.18, 2022).[3] Новые версии выходят дважды в год, поддерживаются две последние.[6] Талисман языка — суслик (gopher), нарисованный Рене Френч.
Особенности языка
- Простота. Около 25 ключевых слов, один вид цикла (
for), нет наследования классов, перегрузки функций и исключений. - Структуры и интерфейсы. Вместо классов — структуры с методами. Интерфейсы реализуются неявно: тип подходит под интерфейс, если у него есть нужные методы, без объявления
implements. - Ошибки как значения. Функции возвращают ошибку последним значением, и её проверяют явно (см. Обработка ошибок в Go).
- Конкурентность. Лёгкие потоки — горутины — и каналы для обмена данными встроены в язык (см. Горутины и каналы).
- Единый стиль. Утилита
gofmtформатирует код однозначно, споров о стиле в сообществе практически нет (см. gofmt и go vet). - Богатая стандартная библиотека: HTTP-сервер и клиент, JSON, криптография, тестирование (см. Стандартная библиотека Go).
Пример
package main
import (
"fmt"
"net/http"
)
func hello(w http.ResponseWriter, r *http.Request) {
name := r.URL.Query().Get("name")
if name == "" {
name = "мир"
}
fmt.Fprintf(w, "Привет, %s!\n", name)
}
func main() {
http.HandleFunc("/", hello)
http.ListenAndServe(":8080", nil) // готовый HTTP-сервер из стандартной библиотеки
}
go run main.go # скомпилировать и запустить
go build -o server # собрать статический исполняемый файл
GOOS=linux GOARCH=arm64 go build # кросс-компиляция под другую платформу
Инструменты
Команда go объединяет всё необходимое: сборку, запуск, тесты (go test), форматирование (go fmt), статический анализ (go vet), управление зависимостями (go mod, см. Go-модули (go.mod)) и генерацию документации. Тестирование и бенчмарки встроены в стандартную библиотеку (см. Тестирование в Go).
Применение
- облачная инфраструктура и DevOps-инструменты;
- сетевые сервисы, API, микросервисы;
- утилиты командной строки — удобно распространять одним файлом;
- прокси-серверы, балансировщики, базы данных (CockroachDB, InfluxDB).
Сравнение
| Go | Rust | Python | |
|---|---|---|---|
| Управление памятью | сборка мусора | владение, без сборщика | подсчёт ссылок + сборщик |
| Скорость компиляции | очень высокая | низкая | не компилируется заранее |
| Порог входа | низкий | высокий | низкий |
| Конкурентность | горутины, каналы | async, потоки, гарантии компилятора | asyncio, процессы |
Подробнее — в статье Go vs Rust — сравнение.
Критика
Go критиковали за многословную обработку ошибок (if err != nil в каждой второй строке), за долгое отсутствие дженериков и за паузы сборщика мусора в задачах с жёсткими требованиями к задержкам. Сторонники отвечают, что простота и предсказуемость важнее выразительности, когда кодом владеют десятки людей.