Синтаксис
По положению пешки догадываешься о короле.
Основным вопросом, которым я озадачился, приступая к продолжению своего труда, было следующее соображение. С одной стороны, мы уже достаточно грамотны, чтобы, оттолкнувшись от примитивов, хоть одним глазком взглянуть, а можно и кавалерийским наскоком - вопрос темперамента; но так или иначе затронуть по горячему следу и вопросы составных типов данных. Однако, С-образность Go в плане простоты перехода от примитивов к массивам и структурам (чем и исчерпывается дело), на практике довольно обманчива, ибо Go всё же более склонен к ООП-стилю мышления. И, во-вторых, Go синтаксически в достаточной мере настолько своеобразный язык, что проскочить рассмотрение синтаксиса "общим местом", как это могло было бы быть в чисто С-образном языке, не представляется возможным. Поэтому поступим со всей строгостью - сначала синтаксис от аза по самую ижицу, затем уж массивы, мапы, структуры, каналы и прочее разговение.
Не с этого следует начинать по-науке, но самая, пожалуй, неожиданная и непривычная особенность Go - это пустота в святая святых - отсутствие (ну, ладно, почти отсутствие), semicolon`a, доведенного до автоматизма каждым в профессии от школьника до пенсионера. Вот так просто - нету точки с запятой, и всё. Нет, я, конечно не мог немного не слукавить - роль знака ";" играет перенос строки. Что, в свою очередь, накладывает на этот самый перенос весомые ограничения. Будучи применён, он имеет своё семантическое значение. Итак, раскрыв одну из главных интриг, вернём речь в последовательно-повествовательное русло.
Объявление переменных.
Переменные могут быть объявлены тремя способами.
При помощи ключевого слова var (без паники, никакого JS, неявно типизированных переменных и так далее). Выглядит это так:
var i int
var str string
var f float64
Как можно видеть, Go - язык с обратным синтаксическим расположением элементов - сперва имя переменной, затем её тип. Вышеуказанным способом переменные могут быть объявлены в любом месте кода программы - будь то как глобальные переменные, либо внутри любой функции или блока. Как правило, область видимости таких переменных максимальна. Будучи поименована с прописной буквы, переменная станет экспортируемой.
Второй способ отчасти deprecated.
Этот способ связан с одновременным присвоением значения переменной в процессе её объявления. Способ вполне легитимный, кроме того, что некоторые инструменты-линтеры, такие как golint, а также плагины для некоторых редакторов (go-plus plugin для Atom), могут вывести что-то наподобие you should omit type string from declaration of var str; it will be inferred from the right-hand side. То есть выведение типа переменной из значения, присваиваемого на лету видится достаточным, дублирование же - напротив, избыточным. Выведение типа - type inference - является в данном случае термином, описывающим это явление.
Третий способ - краткий, при помощи специального символа :=
Не смотря на некоторую непривычность, на самом деле, сей знак используется во множестве, как выражаются профессиональные программисты, Algol-descended языках: Algol, Palsal, Modula, Smalltalk, Pico etc. Чёрт возьми, даже в MySQL можно написать пресловутое :=, что будет таки означать "assign value"!
В Go же сокращённым объявлением переменной можно воспользоваться лишь внутри функции или блока. Вот так:
Nota bene!
Предпочтения линтеров имеют свойство меняться. Нужно стремиться как к чистоте кода, его соответствию лекалам разработчиков, так и сохранности доброго рассудка и здравого смысла.
Честности ради, есть ещё "трёхсполовиновый" способ объявления - "оптовый".
Он используется только с ключевым словом var и чаще тогда, когда мы ходим объявить сразу некий блок переменных. Нетрудно представить себе ситуацию, когда, мысля архитектурно, мы создаём в нашем пакете fqdn.org/utils некий файл objects.go подобного содержания:
Как видно, мы избавили себя от необходимости каждый раз писать ключевое слово var.
Следующая важнейшая вещь в синтаксисе Go - его, скажем прямо, насильственный минимализм. Компилятор не позволит вам подключить неиспользуемый пакет или объявить "впрок" избыточную переменную. И то и другое вызовет ошибку времени компиляции. Правила эти не обсуждаются, не обходятся и не лечатся хитростями. За исключением знака-местоблюстителя "_" (нижнее подчёркивание), который может быть использован как заместитель переменной (вместо неё), или же перед названием подключаемого пакета, который приходится подключать для совместимости (часто при работе с графикой и СУБД). Подробнее об этом мы сможем с вами поговорить, когда изучим функции, дабы не приводить несвоевременные, запутывающие примеры.
Комментарии
Куда же без них! Комментарии - это, пожалуй, для каждого учебника по программированию, есть та самая сущность, о которой читатель узнаёт (явно или неявно) с самого начала и часто несвоевременно. Поскольку буквально каждый пример не обходится без поясняющих (комментирующих) строк в теле кода данного примера. Благо, Go в этом плане мало чем похвалиться. Присутствуют стандартные строчные и блочные комментарии, привычные большинству:
Но всё же попрошу немного вашего внимания! Комментарии в Go только кажутся простыми, аналогичными таковым в С/С++! Не забываем о том, что комментарии необходимы для описания экспортируемых переменных и функций (для чтения таких описаний используется утилита go doc). И, что требует более углублённого понимания, комментарии используются расширением CGO для генерации С-шных хедеров экспортируемых функций при создании *.SO библиотек средствами Go.
Импорт пакетов
Ещё минута вашего внимания. Здесь всё просто. Есть два способа - в строчку или в столбик. Иллюстрации будет достаточно.
Как говорится, one more thing...
На данном этапе мы обладаем той степенью знания синтаксиса языка Go, которая позволяет нам безболезненно начать штудировать что-либо сложнее простейших конструкций и базовых типов данных. Разумеется, наши знания синтаксиса Go будут при этом дополняться.
Раунд!
Last updated
Was this helpful?