пʼятницю, 24 листопада 2017 р.

Go

Расскажу немного о языке программирования Go, его философии и интересных особенностях, которые мне нравятся в нем.

Начну с того, что это достаточно минималистичный язык, разработанный внутри компании Google. Соответственно, нужно понимать, что они разрабатывали его в первую очередь для своих внутренних нужд. Многое в Go до боли напоминает мне их знаменитый Google C++ Style Guide.

Go – это такой современный C со сборщиком мусора. Это компилируемый язык, который взял синтаксис частично из C, частично из Pascal. Но самая главная его киллер-фича – поддержка корутин (M:N), каналов передачи сообщений и мультиплексирование асинхронных операций при помощи ключевого слова select. В Go растущие стеки с начальным размером несколько килобайт, поэтому запуск сотен тысяч одновременно работающих горутин – небольшая проблема.

Многие также называют Go синтезом C++ и Python. Ведь это компилируемый язык с хорошей оптимизацией, но синтаксис объявления переменных почти как в питоне – тип выводится компилятором:

 a := 0
 s := "String"

Причем, мне нравится идея, что объявление переменной это := , а присваивание уже существующей – =.

Из составных структур данных есть только массивы, срезы (динамические массивы), структуры и хэш-таблицы. Все остальное остается как «упражнение к читателю». Хотя уже существует много библиотек, реализующих все остальное.

Обработка ошибок явная:

 if result, err := SomeOperation(); err != nil {
     return err
 }

Примечательно, что есть указатели в той форме, какие они есть в C, но не допускается адресная арифметика.

Можно объявлять типы на основе уже существующих:

 type Celcius float64
 type Fahrenheit float64

Но, в отличии от C, это два разных типа, а не псевдонимы одного и того же, поэтому в выражениях, где используются переменные этих обоих типов, нужно явное приведение.

Инициализация пакетов может происходить в функции init(), а так же явно определен порядок инициализации глобальных переменных, в отличие от C++, где это всегда головная боль.

Достаточно интересна реализация ООП: методы как бы связываются со структурами:

 type Vertex struct { X, Y float64 }
 func Abs(v Vertex) float64 {
     return math.Sqrt(v.X*v.X + v.Y*v.Y)
 }

Многим не нравится данный подход. Им нужны классы с явным наследованием. Но лично я считаю способ в Go более лаконичным и концептуальным. Вот что говорит Алан Кей: «Я придумал термин «объектно-ориентированный», и я уверяю вас, что не имел в виду C++».

Я думаю, что Go сейчас – превосходный инструмент для серверной разработки. Создатель Node.js и ушедший из него, Раян Далом (Ryan Dahl), говорит «Для серверов я не могу представить другой язык кроме Go».

Однако присутствие сборщика мусора, отсутствие средств идентификации потоков и динамическая инициализация глобальных переменных пакетов, делают Go не особо пригодным для разработки игр и графических программ, критичных к задержкам.

Немає коментарів:

Дописати коментар

HyperComments for Blogger

comments powered by HyperComments