Расскажу немного о языке программирования 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 не особо пригодным для разработки игр и графических программ, критичных к задержкам.
Немає коментарів:
Дописати коментар