# Go (язык)

> Компилируемый язык программирования от Google со сборкой мусора, встроенной конкурентностью и минималистичным синтаксисом.

Источник: https://llmdocs.ru/wiki/go/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Класс языка**: императивный, конкурентный, со статической типизацией
- **Появился в**: 2009
- **Авторы**: Роберт Гризмер, Роб Пайк, Кен Томпсон
- **Разработчик**: Google
- **Выпуск версий**: дважды в год (февраль и август)
- **Типизация**: статическая, строгая, структурная для интерфейсов
- **Управление памятью**: сборка мусора
- **Расширение файлов**: `.go`
- **Лицензия**: BSD-3-Clause
- **Сайт**: [go.dev](https://go.dev/)
**Go** (часто **Golang** — по старому домену golang.org) — компилируемый язык программирования со статической типизацией и сборкой мусора, созданный в Google. Он задуман как простой язык для больших команд и больших кодовых баз: быстрая компиляция в один исполняемый файл без зависимостей, встроенная конкурентность и минимум синтаксических конструкций. На Go написаны многие ключевые инструменты облачной инфраструктуры — [Docker](https://llmdocs.ru/wiki/docker.md), [Kubernetes](https://llmdocs.ru/wiki/kubernetes.md), [Terraform](https://llmdocs.ru/wiki/terraform-opentofu.md), [Prometheus](https://llmdocs.ru/wiki/prometheus.md), etcd, [Caddy](https://llmdocs.ru/wiki/caddy.md).

## История

Работу над языком в 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](https://llmdocs.ru/wiki/go-errors.md)).
- **Конкурентность.** Лёгкие потоки — горутины — и каналы для обмена данными встроены в язык (см. [Горутины и каналы](https://llmdocs.ru/wiki/goroutines-channels.md)).
- **Единый стиль.** Утилита `gofmt` форматирует код однозначно, споров о стиле в сообществе практически нет (см. [gofmt и go vet](https://llmdocs.ru/wiki/gofmt-govet.md)).
- **Богатая стандартная библиотека**: HTTP-сервер и клиент, [JSON](https://llmdocs.ru/wiki/json.md), криптография, тестирование (см. [Стандартная библиотека Go](https://llmdocs.ru/wiki/go-stdlib.md)).

## Пример

```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-сервер из стандартной библиотеки
}
```

```bash
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)](https://llmdocs.ru/wiki/go-modules.md)) и генерацию документации. Тестирование и бенчмарки встроены в стандартную библиотеку (см. [Тестирование в Go](https://llmdocs.ru/wiki/go-testing.md)).

## Применение

- облачная инфраструктура и DevOps-инструменты;
- сетевые сервисы, API, микросервисы;
- утилиты командной строки — удобно распространять одним файлом;
- прокси-серверы, балансировщики, базы данных (CockroachDB, InfluxDB).

## Сравнение

| | Go | [Rust](https://llmdocs.ru/wiki/rust.md) | [Python](https://llmdocs.ru/wiki/python.md) |
|---|---|---|---|
| Управление памятью | сборка мусора | владение, без сборщика | подсчёт ссылок + сборщик |
| Скорость компиляции | очень высокая | низкая | не компилируется заранее |
| Порог входа | низкий | высокий | низкий |
| Конкурентность | горутины, каналы | async, потоки, гарантии компилятора | asyncio, процессы |

Подробнее — в статье [Go vs Rust — сравнение](https://llmdocs.ru/wiki/go-vs-rust.md).

## Критика

Go критиковали за многословную обработку ошибок (`if err != nil` в каждой второй строке), за долгое отсутствие дженериков и за паузы сборщика мусора в задачах с жёсткими требованиями к задержкам. Сторонники отвечают, что простота и предсказуемость важнее выразительности, когда кодом владеют десятки людей.

## См. также

- [Горутины и каналы](https://llmdocs.ru/wiki/goroutines-channels.md)
- [Rust (язык)](https://llmdocs.ru/wiki/rust.md)
- [Сборка мусора vs ручное управление памятью](https://llmdocs.ru/wiki/gc-vs-manual-memory.md)
- [Компилятор и интерпретатор](https://llmdocs.ru/wiki/compiler-interpreter.md)

## Источники

1. [Go FAQ — Origins](https://go.dev/doc/faq)
2. [Go 1 and the Future of Go Programs (compatibility promise)](https://go.dev/doc/go1compat)
3. [Go 1.18 Release Notes (generics)](https://go.dev/doc/go1.18)
4. [Effective Go](https://go.dev/doc/effective_go)
5. [The Go Programming Language Specification](https://go.dev/ref/spec)
6. [Go Release History](https://go.dev/doc/devel/release)
