Go (часто также Golang) — компилируемый многопоточный язык программирования, разработанный компанией Google.

file

Язык Go разрабатывался как язык программирования для создания высокоэффективных программ, работающих на современных распределённых системах и многоядерных процессорах.

Предполагается, что программы на Go будут транслироваться компилятором в объектный код целевой аппаратной платформы и в дальнейшем исполняться непосредственно, не требуя виртуальной машины. Архитектура языка изначально проектировалась так, чтобы обеспечить быструю компиляцию в эффективный объектный код. Хотя для Go доступен и интерпретатор, практически в нём нет большой потребности, так как скорость компиляции достаточно высока для обеспечения интерактивной разработки.

Основные возможности языка Go:

  • Go — язык со строгой статической типизацией. Доступен автоматический вывод типов, для пользовательских типов — «утиная типизация».
  • Полноценная поддержка указателей, но без возможности применять к ним арифметические операции, в отличие от C/C++/D.
  • Строковый тип со встроенной поддержкой юникода.
  • Использование динамических массивов, хэш-таблиц, срезов (слайсов), вариант цикла для обхода коллекции.
  • Средства функционального программирования: неименованные функции, замыкания, передача функций в параметрах и возврат функциональных значений.
  • Автоматическое управление памятью со сборщиком мусора.
  • Средства объектно-ориентированного программирования, но без поддержки наследования реализации (наследуются только интерфейсы). По большому счёту, Go является процедурным языком с поддержкой интерфейсов.
  • Средства параллельного программирования: встроенные в язык потоки (go routines), взаимодействие потоков через каналы и другие средства организации многопоточных программ.
  • Достаточно лаконичный и простой синтаксис, основанный на Си, но существенно доработанный, с большим количеством синтаксического сахара.

При этом в язык сознательно не был включён ряд популярных средств.

  • Структурная запись обработчиков исключений сочтена провоцирующей на пропуск ошибок или неадекватную их обработку. Вместо неё предлагается проверка кодов возврата с использованием многозначных функций и специального интерфейса error, а также применение отложенных (deferred) функций для перехвата исключительных ситуаций.
  • Наследование реализации, как считают авторы, приводит к трудноподдерживаемому коду с неявными зависимостями. Аналогичные возможности, но без свойственных наследованию нежелательных эффектов, обеспечиваются поддержкой вложения типов и свободно определяемыми интерфейсами.
  • Обобщённое программирование. Авторы не являются принципиальными противниками обобщённого программирования и не исключают добавление его средств в язык, однако пока от этого воздерживались, поскольку, по их словам[3], предоставляемые таким нововведением возможности не окупают требуемого усложнения компилятора и runtime-библиотек. К тому же уже имеющиеся в языке средства (пустые интерфейсы, «утиная типизация» и рефлексия) позволяют создавать обобщённый код без специальных синтаксических механизмов.
  • Использование утверждений было сочтено ненужным.
  • Переопределение методов и функций было исключено из соображений эффективности компиляции: требование различного именования устраняет необходимость сопоставлять списки параметров при компиляции вызовов функций и методов, при том что сама эта возможность есть не более чем синтаксический сахар.

go 1.9 — добавлены в язык псевдонимы имён типов, уточнены некоторые моменты использования операций с плавающей точкой, оптимизирован инструментарий, дополнение библиотек, в частности — потоково-безопасный тип map.

Обновлено 17 сентября 2018 г.