Немного про Go

В Go есть:

Фреймворк не обязателен

Можно брать и делать веб-сервис без сторонних библиотек и фреймворков. Это был шок. В стандартной библиотеке предусмотрено всё, что нужно, даже шаблонизатор. Таких батареек для веба нет даже у Python.

Обработка ошибок

В Go принято из функций возвращать пару значений: результат и ошибку (есть синтаксический сахар для return). Если ошибка пришла со значением nil, значит все ок. Иначе надо обработать:

func f1(arg int) (int, error) {
if arg == 42 {
return -1, errors.New("can't work with 42")
}
return arg + 3, nil
}

func main() {
for _, i := range []int{7, 42} {
if r, e := f1(i); e != nil {
fmt.Println("f1 failed:", e)
} else {
fmt.Println("f1 worked:", r)
}
}
}

Ошибки каждый раз нужно обрабатывать явно. Можно запилить монаду, но из-за отсутствия параметрического полиморфизма обобщённого решения не получится. Про дженерики в Go много разговоров, может в новой версии сделают.

Язык для работы на работе

Go — скучный язык для больших проектов. Многие его не любят за эту скучность, но кто сказал, что на работе должно быть весело? Разработка в принципе не особо вдохновляет, если не ты её себе придумал и хорошо, когда задачи получается решать побыстрее, без ошибок в рантайме и с менее болезненным процессом замены боевых единиц.

Статическая типизация не допускает ошибок в рантайме, заставляет лучше продумывать код и прикрывает жопу для рефакторинга. Компиляция в исполняемый файл без зависимостей обеспечивает скорость выполнения и удобный деплой. Намеренно аскетичный синтаксис позволяет быстро освоить язык и тратить меньше времени на всякие соглашения.

Подход Go чем-то похож на принципы Clojure. Тут свой Simple вместо Easy, но другими средствами и по другим причинам. Рич Хикки, создатель Clojure, пошел в сторону функционального программирования, иммутабельности и проработки индивидуального экспириенса. Авторы Go — в сторону структурного программирования, типизации и императивности, чтобы корпорациям было проще находить себе сотрудников. Языки совсем разные, но простота решений — часть философии и там, и там.

Go поставляется с инструментами для тестирования, управления пакетами, отладки, форматирования кода и составления документации. Не надо выбирать, вот оно, сразу под рукой.

Даже шрифт сделали для кода и обычного текста. Мне зашёл, использую:

Шрифт Go Mono, код на Pyret.

У JetBrains есть IDE.

В Go нет ООП в привычной многим «классовой» интерпретации. Есть типы, структуры, интерфейсы. Авторы решили, что этого достаточно.

Object-oriented design is the roman numerals of computing.

Применение

В основном бэкенд, сетевые сервисы, консольные утилиты. Для микросервисов его часто выбирают (Docker и Kubernetes написаны по большей части на Go).

Если бизнес работает на вебе и не строится вокруг шаблонных решений, Go часто считают хорошим вариантом. Вот Ozon, например, на Go переехал.

Ссылки

Интересные инструменты, которые попались по дороге:

Книги, которые смотрел (понравились):