Go (язык)

Материал из llmdocs — справочник разработчика
Портал: Go и Rust
Go (язык)
Класс языкаимперативный, конкурентный, со статической типизацией
Появился в2009
АвторыРоберт Гризмер, Роб Пайк, Кен Томпсон
РазработчикGoogle
Выпуск версийдважды в год (февраль и август)
Типизациястатическая, строгая, структурная для интерфейсов
Управление памятьюсборка мусора
Расширение файлов.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 в каждой второй строке), за долгое отсутствие дженериков и за паузы сборщика мусора в задачах с жёсткими требованиями к задержкам. Сторонники отвечают, что простота и предсказуемость важнее выразительности, когда кодом владеют десятки людей.

См. также

Источники

  1. Go FAQ — Origins
  2. Go 1 and the Future of Go Programs (compatibility promise)
  3. Go 1.18 Release Notes (generics)
  4. Effective Go
  5. The Go Programming Language Specification
  6. Go Release History