Go (часто также Golang) — компилируемый многопоточный язык программирования, разработанный компанией Google.
Язык Go разрабатывался как язык программирования для создания высокоэффективных программ, работающих на современных распределённых системах и многоядерных процессорах.
Предполагается, что программы на Go будут транслироваться компилятором в объектный код целевой аппаратной платформы и в дальнейшем исполняться непосредственно, не требуя виртуальной машины. Архитектура языка изначально проектировалась так, чтобы обеспечить быструю компиляцию в эффективный объектный код. Хотя для Go доступен и интерпретатор, практически в нём нет большой потребности, так как скорость компиляции достаточно высока для обеспечения интерактивной разработки.
Основные возможности языка Go:
- Go — язык со строгой статической типизацией. Доступен автоматический вывод типов, для пользовательских типов — «утиная типизация».
- Полноценная поддержка указателей, но без возможности применять к ним арифметические операции, в отличие от C/C++/D.
- Строковый тип со встроенной поддержкой юникода.
- Использование динамических массивов, хэш-таблиц, срезов (слайсов), вариант цикла для обхода коллекции.
- Средства функционального программирования: неименованные функции, замыкания, передача функций в параметрах и возврат функциональных значений.
- Автоматическое управление памятью со сборщиком мусора.
- Средства объектно-ориентированного программирования, но без поддержки наследования реализации (наследуются только интерфейсы). По большому счёту, Go является процедурным языком с поддержкой интерфейсов.
- Средства параллельного программирования: встроенные в язык потоки (go routines), взаимодействие потоков через каналы и другие средства организации многопоточных программ.
- Достаточно лаконичный и простой синтаксис, основанный на Си, но существенно доработанный, с большим количеством синтаксического сахара.
При этом в язык сознательно не был включён ряд популярных средств.
- Структурная запись обработчиков исключений сочтена провоцирующей на пропуск ошибок или неадекватную их обработку. Вместо неё предлагается проверка кодов возврата с использованием многозначных функций и специального интерфейса error, а также применение отложенных (deferred) функций для перехвата исключительных ситуаций.
- Наследование реализации, как считают авторы, приводит к трудноподдерживаемому коду с неявными зависимостями. Аналогичные возможности, но без свойственных наследованию нежелательных эффектов, обеспечиваются поддержкой вложения типов и свободно определяемыми интерфейсами.
- Обобщённое программирование. Авторы не являются принципиальными противниками обобщённого программирования и не исключают добавление его средств в язык, однако пока от этого воздерживались, поскольку, по их словам[3], предоставляемые таким нововведением возможности не окупают требуемого усложнения компилятора и runtime-библиотек. К тому же уже имеющиеся в языке средства (пустые интерфейсы, «утиная типизация» и рефлексия) позволяют создавать обобщённый код без специальных синтаксических механизмов.
- Использование утверждений было сочтено ненужным.
- Переопределение методов и функций было исключено из соображений эффективности компиляции: требование различного именования устраняет необходимость сопоставлять списки параметров при компиляции вызовов функций и методов, при том что сама эта возможность есть не более чем синтаксический сахар.
go 1.9 — добавлены в язык псевдонимы имён типов, уточнены некоторые моменты использования операций с плавающей точкой, оптимизирован инструментарий, дополнение библиотек, в частности — потоково-безопасный тип map.