Язык программирования go: мнения и перспектива

Введение

Go – это язык программирования, который был разработан корпорацией Google. Часто его еще называют “Golang” – сокращение от “Google language”. Это компилируемый и многопоточный язык, релиз которого состоялся в ноябре 2009 года, а самый свежий выпуск 1.6 датируется февралем 2016 года. Одной из ключевых фигур, которые принимали участие в создании Go, является Роб Пайк, известный разработчик языков программирования, а также операционных систем, в данный момент работающий в Google. Выступая на одной из конференций, он отметил, что язык Go – это попытка перенять лучшие стороны таких языков, как C++ и Java.


В этой статье мы попробуем разобраться, насколько популярен язык Go, есть ли у него перспективы развития, и что об этом языке думают сами программисты.

2.1. Именуйте идентификаторы исходя из ясности, а не краткости

Хорошее имя лаконично. Оно не обязательно должно быть самым коротким, но не содержит лишнего. У него высокое отношение сигнал/шум.

Хорошее имя является описательным. Оно описывает применение переменной или константы, а не содержимое. Хорошее имя описывает результат функции или поведение метода, а не реализацию. Назначение пакета, а не его содержимое. Чем точнее имя описывает вещь, которую идентифицирует, тем лучше.

Хорошее имя предсказуемо. По одному названию вы должны понимать, как будет использоваться объект

Названия должны быть описательными, но также важно следовать традиции. Вот что имеют в виду программисты Go, когда говорят «идиоматический».

Взгляд на Golang

Go постепенно подрывает устоявшийся мир веб-приложений. Он нативно поддерживает параллельное выполнение, что устраняет потребность почти во всех компонентах, обычно используемых для работы с ограничениями GIL.

Программы на Go представляют собой бинарники, которые нативно запускаются, так что не требуется ничего языкоспецифического устанавливать на сервер. Исчезает проблема обеспечения правильной версии среды исполнения, требуемой приложением; отдельной среды исполнения нет — она встроена в бинарник. Программы на Go могут легко и элегантно запускать задачи в фоне, поэтому нет нужды в инструментах типа Resque. Эти программы запускаются как единственный процесс, так что кэширование становится тривиальным, а значит, Memcached или Redis не нужны. Go может управлять неограниченным количеством параллельных соединений, нивелируя надобность в фронтэндной защите, такой как Nginx.

С Go высокая многослойная башня из Python, Ruby, Bundler, Virtualenv, Unicorn, WSGI, Resque, Memcached, Redis, и т.д., и т.п. уменьшается до всего лишь одного бинарника. Единственный сторонний компонент, который обычно все еще нужен, — это база данных (я бы посоветовал PostgreSQL)

Тут важно отметить, что все эти инструменты по прежнему можно использовать, но с Go можно обойтись и без них

Время запуска такой Go-программы будет, скорее всего, на порядок превосходить любое приложение на Python/Ruby, потребует меньше памяти и строк кода.

Хорошо, а есть популярный фреймворк?

Краткий ответ таков: фреймворк является необязательным и не рекомендуется. Существует множество проектов, претендующих на роль отличного фреймворка, но я считаю, что лучше обойтись без них. Это не только мое личное мнение, я нахожу это мнение довольно распространенным в сообществе Go.

Надо понимать, зачем вообще были созданы фреймворки. В мире Python/Ruby так случилось потому, что эти языки не были изначально спроектированы для обслуживания веб-страниц, и для решения этой задачи необходимо было множество внешних компонентов. То же самое можно сказать и про Java, который, как и Python, и Ruby, стары как веб, каким мы его знаем, или даже немного старше.

Насколько я помню, ранние версии Python «из коробки» не предоставляли ничего для работы с базой данных, не было шаблонов, поддержка HTTP была запутанной, работа с сетью — нетривиальной, даже шифрование тогда было незаконным и в общем, много чего еще отсутствовало. Фреймворк обеспечивал все эти необходимые кусочки и устанавливал характерные для языка правила разработки для всех распространенных вариантов веб-приложений.

Go, с другой стороны, создавался людьми, которые уже имели опыт и разбирались в веб-разработке. Он включает в себя практически все необходимое. Один-два внешних пакета могут понадобиться для решения некоторых конкретных задач, типа OAuth, но ни в коем случае эта пара пакетов не является «фреймворком».

Если все вышеприведенное касаемо фреймворков звучит не достаточно убедительно, полезно рассмотреть кривую обучения для фреймворков и риски. Мне понадобилось около двух лет, чтобы наладить отношения с Rails. Фреймворки могут стать заброшенными и устаревшими, а переносить приложение на новый фреймворк тяжело, а иногда и невозможно. Учитывая, как быстро все меняется в информационных технологиях, фреймворк уж точно не следует выбирать легкомысленно.

Я хотел бы особо выделить инструменты и фреймворки, которые пытаются имитировать идиомы, общие для Python, Ruby или сред JavaScript. Все, что выглядит, или ощущается, или претендует на роль «Rails for Go», включая такие техники, как инъекции, динамическая публикация методов и т.п., которые сильно зависят от рефлексии, не вписывается в идеологию Go, поэтому лучше от такого держаться подальше.

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

Другая проблема, общая для фреймворков, это то, что они абстрагируют низкоуровневые механизмы от разработчика так, что со временем они становятся настолько загадочными, что буквально невозможно понять, что у них там на самом деле происходит. То, что начинается с лексического псевдонима для одной строки JavaScript становится слоем в слоях транспайлеров, минимайзеров, поверх хелперов, скрытых где-то в подзависимостях. Однажды что-то ломается, и невозможно понять, где искать проблему. Приятно, когда точно знаешь, что происходит, и Go в этом очень хорош.

Пакеты

Представленной информации вполне достаточно для создания простейших программ, поэтому можно перейти к обсуждению архитектуры go-программы. Каждая программа – это пакет (см. в листинге 1), а точнее набор пакетов. Программы собираются из пакетов, и то, что обычно называется библиотеками, в go называется набором пакетов.

Исполняемая программа должна иметь пакет и метод , с которого начинается выполнение программы, и по завершении которого программа закрывается. Выражение дает доступ к методам, переменным и константам пакета . Обращаться к ним следует через оператор (точка), например, .

Область видимости в go несколько отличается от таковой в языке С. Внутри пакета все переменные, функции, константы и типы имеют глобальную видимость. Но для обращения к ним из клиента, импортировавшего этот пакет, имена последних должны начинаться с большой буквы.

Например, клиент импортировал пакет package, в котором объявлены следующие переменные:

const hello = “Im not visible in client, just in package” //видна только в пакете
const Hello = “I can say hello to client” //видна также при импорте

Хотя язык go достаточно молод, он уже имеет обширную библиотеку пакетов. Выше использовался пакет , предназначенный для форматированного ввода/вывода. Пакет предоставляет доступ к файлам, аргументам командной строки, позволяет запускать другие программы и т.д. Есть пакеты для шифрования, сжатия, кодирования и журналирования. Отдельного внимания заслуживают пакеты , , для работы с сетью, позволяющие без особых усилий создавать Web-приложения. В стандартной поставке есть даже пакет для работы с изображениями. После установки в каталоге $HOME/go появляется каталог pkg, в котором есть каталог, соответствующей архитектуре. В этом каталоге выполняется хранение и поиск пакетов.

Пример использования

В языке go отсутствуют такие понятия, как класс, конструктор и деструктор (вместе с соответствующими зарезервированными словами). Однако в нем существуют структуры, позаимствованные из языка С, к которым можно привязать функции, поэтому в go можно создавать код и в стиле ООП. Наличие «сборщика мусора» упрощает работу с памятью, по сравнению с C или С++. Существуют и указатели, но арифметика для них не предусмотрена. Поэтому, даже зная адрес переменной, перемещаться в памяти относительного него невозможно. Это сделано из соображений безопасности. Сравнивая язык go с С++, стоит упомянуть о невозможности перегрузки функций и об отсутствии определяемых пользователем операций. Нет также заголовочных файлов и неявного преобразования типов. Многопоточность поддерживается на уровне языка, для связи потоков используются каналы. Они будут рассмотрены более подробно ниже.

В листинге 1 представлен пример программы на языке go, который будет понятен любому программисту, знакомому с синтаксисом C.

Листинг 1. Первое знакомство с go
package main

import "fmt"

func main() {
        fmt.Println("Hello, World")
}

Для работы с языком go потребуется установить следующее программное обеспечение:

  • GCC;
  • стандартная библиотека С;
  • генератор bison;
  • make;
  • awk;
  • редактор ed.

На платформе Ubuntu/Debian для этого используется следующая команда:

sudo apt-get install bison ed gawk gcc libc6-dev make.

Затем необходимо загрузить из репозитария дистрибутив языка go. Для этого используется Mercurial – мультиплатформенная распределённая система управления версиями, которую можно загрузить командой:

sudo apt-get install mercurial.Mercurial

Следующая команда загружает уже непосредственно сам язык:

$ hg clone -r release https://go.googlecode.com/hg/ go

Последний параметр — это имя каталога, в который будет установлен go. В данном примере подразумевается, что установка ведется из домашнего каталога пользователя и изначально каталога go нет. В противном случае могут возникнуть проблемы, так как по умолчанию go считает, что он установлен в каталоге $HOME/go. Если установить дистрибутив go в другой каталог, то его надо указать в переменной окружения $GOROOT, как показано ниже.

export GOROOT=$HOME/goX.

После получения дистрибутива можно переходить к сборке go:

$ cd go/src
$ ./all.bash

На этом этапе будут собраны соответствующие библиотеки и исполняемые файлы. Если в конце в консоли будет напечатано сообщение ALL TESTS PASSED, то сборка прошла успешно, и можно приступать к программированию на go. Если возникают ошибки, это может быть связано с отсутствием инструментов, перечисленных выше. Также при отсутствии подключения к Интернет могут возникнуть ошибки при прохождении автоматизированных тестов, но это не является критичным для дальнейшей работы.

После этих действий код из листинга 1 можно сохранить в файле с именем hello.go и добавить значение $HOME/go/bin в переменную $PATH. В листинге 2 показано, как выполнить компиляцию и запуск go-программы на 32-битной версии Linux.

Листинг 2. Компиляция и запуск go-программы
//компиляция исходного кода
$ 8g hello.go
//компоновка
$ 8l hello.8
//запуск исполняемого файла
$ ./8.out
//результат работы программы
Hello, World

Как видно, процесс компиляции и запуска в языке go совпадает с процессом, использующемся в языках С/С++. Для других платформ будут использоваться другие версии компилятора и компоновщика: 6g/6l для amd64 и 5g/5l для arm.

Версия 6

Ещё один вариант, который я хотел бы протестировать это инициализация параметров цепочкой

Я забыл, как этот паттерн называется, но и не важно, потому что паттерны должны рождаться из кода, а не наоборот

Идея в том, что при создании объекта, мы его возвращаем, и тут же можем вызывать метод-сеттер, который возвращает изменённый объект – и так один за другим:

или

Тогда наш код для Scaffold-виджета будет выглядеть вот так:

Это тоже не сильно чужеродный концепт для Go – многие библиотеки его используют для опций конфигурации, например. Он синтаксически несколько отличается от Dart-версии, но всё таки обладает всеми необходимыми свойствами:

  • явное построение дерева
  • именованные «параметры»
  • отступы помогающие понять глубину виджета
  • возможность указывать обработчики и произвольный код

Также во всех примерах мне нравится использование классического именования для конструкторов – просто функция, которая создаёт объект. Это сильно проще объяснять новичку в программировании, чем объяснять конструкторы — «это тоже функция, но у неё имя такое же, как у класса, но ты не увидишь эту функцию, потому что она специальная, и просто глядя на функцию, ты не можешь легко понять – это функция или конструктор объекта с таким именем».

Так или иначе, из всех вариантов, 5-й и 6-й мне кажутся наиболее привлекательными.

Финальная версия кода

Соберём все части вместе и попробуем записать наш «hello, world» на воображаемом Flutter на Go:

main.go

app.go:

home_page.go:

Очень даже ничего!

Заключение

Похожесть с Vecty

Я не мог не обратить внимание на то, как сильно моё решение напоминает то, как мы пишем код на Vecty. Во многом, они, в принципе, похожи, только Vecty выводит результат в DOM/CSS/JS, а Flutter под собой несёт мощный и написанный с нуля движок рендеринга и анимаций, дающий красивейшую графику и крутую анимацию на 120 кадрах в секунду

Но мне кажется, что дизайн Vecty очень удачен, и моё решение для Flutter на Go напоминает Vecty неспроста.

Лучшее понимание дизайна Flutter

Этот мысленный эксперимент был интересен сам по себе – не каждый день приходится писать код на фреймворке, которого не существует. Но он также заставил меня глубже копнуть дизайн и техническую документацию Flutter, чтобы лучше понять что стоит за той скрытой магией.

Недостатки Go

Отвечая на вопрос «Может ли Flutter быть реализован на Go?» мой ответ однозначное «да», но я, безусловно, предубеждён, наверняка ещё не знаю массу ограничений и требований, стоящих перед Flutter, и, вообще, такие вопросы не имеют «правильного» ответа всё равно. Я больше был заинтересован в том, что именно в Go хорошо или плохо ложится на нынешний дизайн.

Эксперимент продемонстрировал, что наибольшая проблема с Go была исключительно в синтаксисе. Невозможность вызывать функцию и передать имена параметров создала существенные затруднения в дизайне читабельного и понятного дерева виджетов. Есть предложения по добавлению именованных параметров в будущие версии Go, и, похоже, эти изменения даже обратно-совместимые. Но их добавление – это ещё одна вещь для изучения, ещё один выбор перед каждой функцией и так далее, так что кумулятивная польза не так уж очевидна.

Мысли о будущем Flutter

Мои заключительные мысли будут о том, что Flutter необыкновенно хорош, несмотря на всё то бурчание, которое я себе позволил в этой статье. Соотношение «крутота/так себе» на удивление велико, и Dart достаточно легко схватывается (как минимум, людям, знакомым с другими языками программирования). Учитывая браузерную родословную Dart, я мечтаю, что однажды все браузерные движки (хотя, сколько их там осталось) будут идти с DartVM вместо V8, и Flutter будет интегрирован нативно – и все Flutter приложения автоматически будут также и веб-приложениями.

Работа, проделанная над фреймворком просто астрономическая. Это проект высочайшего качества и с отличным и растущим комьюнити. Как минимум, количество неоправданно качественных материалов и туториалов просто ошеломительное как для фреймворка, версия 1.0 которого вышла меньше месяца назад. Надеюсь, когда-нибудь также внести свою лепту в проект.

Для меня это game changer, и я надеюсь освоить Flutter настолько, насколько возможно и писать мобильные приложения для себя и ради удовольствия, ибо это больше не будет удел компаний со штатом мобильных разработчиков.

Даже если вы никогда не видели себя в качестве разработчиках мобильных UI – попробуйте Flutter, это глоток свежего воздуха.

  • https://flutter.io
  • Flutter Tutorial for Beginners — Build iOS and Android Apps
  • Go proposal: An Improved, Golang-Cohesive Design for Named Arguments
  • Go proposal: spec: untyped composite literals

Python или Go — Что быстрее для веб-разработки?

Кому знакома ситуация, когда хочется поскорее закончить работу и как-то развлечься? Конечно всем. А ведь скорость увеличивает производительность. Python быстр при разработке сайтов и является многофункциональным языком, но Golang может оказаться быстрее, чем Python.

Golang является неплохим языком для написания серверных сценариев и для высокой производительности. Golang предлагает быстрые циклы разработки. Производительность — это ключ, а Golang — мастер скорости и производительности.

Golang также обладает лучшей поддержкой многопоточности. Python требует большего использования ресурсов высшего уровня для процесса многопоточности, тогда как Golang лучше экономит ресурсы и память с помощью изолированных горутин.

При работе с бэкендем, Golang несомненно выигрывает, он отлично работает с большим количеством запросов с высокой конкурентностью. У Golang также более низкий порог входа, чем у Python. В общем и целом Golang спроектирован для людей, которые хотят создавать сайты максимально быстро.

Синтаксис

Пакеты

Каждая программа на языке Go состоит из пакетов (packages). Пакет — главный, с него начинается выполнение программы. В приведённом выше примере импортируется пакет .

Импорт пакетов можно описать двумя способами.

Так:

или так:

Функции

Общая форма определения функции выглядит следующим образом:

Количество и тип входных аргументов может быть любым. Для примера опишем функцию с двумя входными параметрами формата :


Выполним этот код и получим следующий результат:

Переменные

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

С помощью оператора определяем перечень переменных, причём тип данных указываем в конце выражения.

Объявление возможно как на уровне пакета, так и на уровне функции. Рассмотрим пример:

Выполним этот код и получим следующий результат:

Оператор цикла

В языке Go один оператор цикла — это , который повторяет список инструкций заданное количество раз. Цикл состоит из трёх выражений:

  1. Инициализация. Выполняется перед первой итерацией.
  2. Условие. Вычисляется перед каждой итерацией.
  3. Инкремент. Выполняется после каждой итерации.

Общая форма цикла выглядит так:

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

Цикл останавливает свою работу, когда условие принимает значение .

Примечание В отличие от таких языков, как C, Java и JavaScript, перечисленные выражения цикла не выделяются скобками. В данном случае обязательны лишь фигурные скобки, обрамляющие тело цикла.

Рассмотрим пример программы:

Выполним этот код и получим следующий результат:

Условный оператор

Форма определения условного оператора в Go выглядит следующим образом:

Если выражение в поле условия истинно, код, размещённый между фигурными скобками, выполнится.

Условие описывается значением, переменной или выражением. Например:

  • — выполняется всегда;
  • — выполняется, когда меньше ;
  • — выполняется, когда меньше или меньше ;
  • — выполняется, когда меньше и меньше .

Рассмотрим пример программы:

Выполним этот код и получим следующий результат:

Массивы

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

Чтобы объявить массив, необходимо указать тип и требуемое количество элементов следующим образом:

Например, чтобы создать массив , состоящий из десяти элементов типа , используем следующее выражение:

Если значения элементов известны, для определения массива допустимо использовать следующую конструкцию:

Длина массива не изменяется, потому что является частью типа данных. Это кажется ограниченным решением, но не волнуйтесь: в Go реализована комфортная работа с массивами.

Рассмотрим пример программы:

Выполним этот код и получим следующий результат:

Срезы

Срезы (Slices) в Go — абстракция над массивами. Хотя встроенных способов увеличить размер массива динамически или сделать вложенный массив в Go нет, срезы убирают это ограничение. Они предоставляют полезные функции и широко используются программистами.

Объявить срез можно как массив, но без указания размера или с помощью функции :

Размер массива фиксирован, а у среза изменяемый. По сути, срез — более общий вид массива.

Тип — срез с элементами типа .

— срез 5 элементов массива .

Рассмотрим пример программы:

Выполним этот код и получим следующий результат:

Структуры


Структура (structure) — пользовательский тип данных, который кроме прочего комбинирует элементы разных типов. Чтобы объявить структуру, используем выражения и .

определяет тип данных, которому соответствует два и более элементов.

связывает заданное имя с описанием структуры.

Форма описания выглядит следующим образом:

Как только структура типа определена, он может использоваться при объявлении новых переменных:

Чтобы получить доступ к элементам структуры, используем оператор доступа к элементу. Рассмотрим на примере:

Выполним этот код и получим следующий результат:

Появление одностраничных приложений

Все дальше и дальше в прошлое уходит генерация HTML на сервере. Последняя (и правильная) тенденция заключается в построении пользовательского интерфейса и рендеринге полностью на стороне клиента, с помощью JavaScript. Приложения, чей пользовательский интерфейс полностью управляется JS, иногда называют одностраничным приложением и, на мой взгляд, за ними будущее, нравится нам это или нет. В таких приложениях сервер только обслуживает данные, обычно в виде JSON, не создавая HTML-кода. В этом случае та огромная сложность, введенная в первую очередь для возможности использования популярного скриптового языка , оказывается ненужной. Особенно учитывая, что Python или Ruby приносят мало выгоды, когда весь вывод — это JSON.

Функциональное программирование в go

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

Листинг 7. Конструкции для управления ходом выполнения программы
Loop: for i := 0; i < 10; i++ {
	switch f(i) {
		case 0, 1, 2: break Loop
	}
	g(i)
}

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

Функции объявляются при помощи ключевого слова . Особенностью является то, что они могут возвращать сразу несколько значений, по аналогии с множественным присваиванием, как показано в листинге 8.

Листинг 8. Множественное присваивание и создание функций
var v1,v2 uint32 = 10, 20

func MySqrt(f float) (v float, ok bool) {
	if f >= 0 { v,ok = math.Sqrt(f),true }
	else { v,ok = 0,false }
	return v,ok
}

После параметров в скобках указываются типы возвращаемых значений. В случае c одним значением скобки не используются. Еще одна интересная возможность — это выражение defer, пример использования которого приведен ниже.

defer foo();

Конструкция представляет собой некий триггер, и функция будет вызвана по достижении . Если используется в функции несколько раз, то соответствующие методы выстраиваются в стек. Польза от подобного нововведения неочевидна, особенно при большом объеме кода. Так программисту, незнакомому с кодом, придется держать в памяти весь этот стек вызовов со всеми параметрами. При использовании структурное программирование не обеспечивается.

Плюсы языка Go

У языка Go есть несколько положительных черт, выделяемых программистами, которые на нем пишут.

Во-первых, это его простота. Язык Go разрабатывался в качестве замены C: его высокая производительность почти сопоставима с языком Си, но более простой синтаксис дает возможность разрабатывать приложения гораздо быстрее (к примеру, как на Python). При этом многие разработчики изучают этот язык после Python или PHP либо используют два языка в связке (Python/Go и PHP/Go)

Упрощенный синтаксис облегчает не только написание своего собственного кода, но и чтение кода, написанного другими программистами, что особенно важно в командной работе

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

Программисты постоянно сравнивают язык Go с другими языками: в его пользу свидетельствует тот факт, что, к примеру, в PHP существует 67 ключевых слов, а в Go их всего лишь 25.

Тут необходимо сделать отступление и сказать о том, что желание создать простой язык программирования родилось у разработчиков Google неслучайно: изначально они задумывали Go как быстро изучаемый язык, который запросто могут выучить несколько не очень опытных программистов для того, чтобы затем вместе писать какое-нибудь приложение. Именно поэтому некоторые считают язык Go языком, пригодным для больших корпораций, где в разработке продуктов будет участвовать множество разных людей. Как уже было замечено выше, простой и понятный синтаксис ведет к тому, что программистам Go не нужно вводить какие-то другие стандарты, обозначения или комментарии – они и без этого отлично поймут код друг друга. Многословность Go радует одних разработчиков и огорчает других, но именно благодаря ей код Go читается так легко.

Поэтому некоторые компании (к примеру, CrowdStrike) сознательно переходят с других языков программирования на Go для того, чтобы в дальнейшем более легко расширять пул своих разработчиков.

Во-вторых, Go имеет большое количество библиотек, благодаря которым можно выполнить практически любую поставленную задачу. Многое можно реализовать, используя только стандартную библиотеку Go, которая легко читается, а также отличается хорошим качеством и скоростью. Отдельного внимания заслуживает эффективное взаимодействие с библиотеками языка Си; некоторые отмечают, что Go-библиотеки по факту являются просто обертками над С-библиотеками.

В-третьих, Go это компилируемый язык, на котором можно быстро написать необходимое приложение. Go имеет такую же строгую статическую типизацию, как Pascal, но в то же время он имеет гораздо больший прикладной характер (и это роднит его с Python). Тут необходимо отметить высокую производительность Golang, которая характерна для компилируемых языков. Также в Go значительно облегчена кроссплатформенность.

Нельзя не отметить и четкую направленность языка Go: в отличие от PHP, на котором пишут большие проекты, Go больше предназначен для некрупных сервисов, которые необходимо быстро написать и внедрить, но которые должны отличаться чрезвычайной надежностью (так называемое robust software).

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

Синтаксис Go может быть непривычен тем, кто до этого программировал на PHP или Python. Если рассматривать код Go в сравнении с PHP, то Go не имеет объектов или классов, зато в нем есть структура, а точнее тип, который содержит именованные поля:

type Circle struct {
 x, y, r float64
}

Еще одной причиной, по которой Go завоевывает все большую популярность, является наличие go fmt – инструмента, который помогает стандартизировать код. А использование go vet поможет вам найти возможные проблемы в коде. Иными словами, авторы языка Go попытались максимально упросить задачу разработки приложений на этом языке, особенно для новичков.

Именно поэтому многие на данный момент считают Go одним из лучших языков программирования и советуют изучать его не только студентам, но и школьникам. Кстати, такой прецедент уже был: учитель научил несколько 11-летних школьников писать и разбираться в коде на таком уровне, что они смогли написать генератор фракталов Мандельброта. А главное, для этого ему понадобилось всего 12-13 часов!

Версия 4

Давайте немного отступим назад и зададимся вопросом – что собственно мы пытаемся сделать. Нам необязательно слепо копировать подход Dart (хотя это будет приятный бонус – меньше нового учить людям, уже знакомым с Flutter на Dart). По сути, мы просто создаём новые объекты и присваиваем им свойства.

Может попробовать вот таким способом?

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

Кстати, этот подход использовался очень давно в UI фреймворках вроде GTK или Qt. Посмотрите, например, на код из документации последнего Qt 5:

Поэтому вполне допускаю, что для кого-то такой формат будет привычней и роднее. Но, всё же, тяжело спорить с тем, что это не наилучший способ построения дерева виджетов в виде кода.

Заключение

В 2009 go был признан языком года по версии организации TIOBE. Сложно сказать, насколько этот язык «созрел» для серьезных проектов, но его потенциал очевиден. Простота создания многопоточных и сетевых приложений позволяет говорить о жизнеспособности и востребованности проекта в целом. «Идеологическое родство» с языками С и С++, возможно, поможет языку go, как в свое время родство с С помогло развитию C++, а родство с C++ способствовало становлению Java. Огромную роль играет и поддержка со стороны разработчика языка – компании Google, возможно, самой влиятельной IT-компании на данный момент. В следующих статьях будут рассматриваться более сложные аспекты программирования на языке go.


С этим читают