Go – это язык общего назначения с богатыми возможностями и прозрачным синтаксисом. Так он анонсируется на сайте проекта, но точно так же можно сказать о Java, C/C++, Basic, Pascal, Python и многих других языках программирования. Давайте попробуем копнуть чуть глубже, чтобы узнать, что он собой представляет.
Язык Go родился в недрах лабораторий интернет-гиганта Google, и это обусловило его предназначение. Он прекрасно подходит для быстрой и эффективной реализации сетевых служб. Все необходимые для этого модули входят в его стандартную библиотеку, а на уровне языка в нем имеются средства распараллеливания участков кода (goroutines, которые можно было бы перевести как подпрГОраммы, если бы это слово не было так тяжело представить, а не то, что выговаривать) и их синхронизации (каналы, реализующие механизм очередей).
На момент написания статьи последняя версия языка имеет номер 1.4.2, что для проектов с открытым исходным кодом говорит о достижении стабильности и уверенном планомерном развитии. Распространяется компилятор Go по лицензии BSD, что позволяет свободно применять его не только в хобби-проектах, но и в коммерческих разработках.
Goвилонское столпотворение
Говорят, что из программиста, который начинал программировать на Бейсике, никогда не получится хорошего специалиста. Интересно, какие специалисты получатся из тех, кто начнет программировать на Go?
Дело в том, что язык Go реализует концепции структурной, объектно-ориентированной и функциональной парадигм программирования. Но реализует их частично и по-своему.
Положения структурного программирования пошатывались уже довольно давно. Их начали подтачивать возможности досрочного выхода из циклов, потом свою роль сыграли средства «структурной обработки исключений» (как ни лицемерно это звучит). И тут появился язык Go с концепцией отложенного выполнения функций.
Что это означает? Допустим, мы написали функцию A. В ее теле в любом месте с помощью оператора defer мы можем декларировать отложенный вызов других функций: B, C, D... Теперь, когда функция A завершит свою работу, произойдет вызов отложенных функций в порядке, обратном тому, в котором они были декларированы, т.е. ...D, C, B. Отложенные функции будут выполнены независимо от причины завершения функции A: подостижении последнего оператора, по явной команде return или из-за ошибки времени выполнения. Такой вот блок finally. Или элемент еще не озвученной в статье декларативной парадигмы программирования?
Отложенное выполнение функций рекомендуется применять для гарантированного освобождения ресурсов. Например, необходимость закрытия файла может декларироваться в непосредственной близости от оператора, осуществляющего его открытие. И по завершении работы функции произойдет как будто выполнение ее деструктора, совершающего действия, которые «надо не забыть сделать».
Что касается объектно-ориентированного программирования, то оно построено вокруг структур. Разграничение доступа к полям отсутствует как класс. Методы определяются за пределами структур как специального вида функции с дополнительным элементом «приемник» в заголовке. Приемник описывается как параметр типа «структура», к которой будет прикреплен этот метод. В теле метода поля этого параметра могут использоваться вразличных выражениях.
Таким способом метод может быть назначен практически любому типу данных, кроме интерфейсов и указателей. В этом проявляется сходство языка Go с JavaScript.
Наследование выглядит как вложение структуры-предка в структуру-потомка. Это нагляднее, чем запись класса-потомка через двоеточие в C++. Поля предка в методах потомка перестают быть доступными (как будто они определены со спецификатором private). Их можно использовать только посредством методов-свойств структуры-предка.
Полиморфизм реализован через интерфейсы, причем оригинальным образом. Интерфейс определяется сам по себе, безотносительно к структурам, и содержит только перечень методов. А уже любая структура, имеющая в своем составе все методы, перечисленные в интерфейсе, считается реализующей этот интерфейс. Напоминает позднее связывание на уровне исходных текстов.
Сказанное выше иллюстрирует программа, моделирующая концерт на планете Кин-дза-дза: