Go in a nutshell
  • Go in a nutshell
  • Введение
  • Родословная или Should I Go?
  • Hello, world!
  • Базовые типы данных
  • Go - установка, сборка
  • Алфавит и пакеты
  • Синтаксис
  • Приведение типов
  • Операторы
  • Константы
  • Управление потоком
  • Массивы, срезы, отображения
  • Именованные типы и структуры
  • Указатели и оператор new
  • Функции
  • Работа с параметрами командной строки
  • Завершение работы программы
  • Методы
Powered by GitBook
On this page
  • Объявление переменных.
  • Комментарии
  • Импорт пакетов

Was this helpful?

Синтаксис

По положению пешки догадываешься о короле.

Основным вопросом, которым я озадачился, приступая к продолжению своего труда, было следующее соображение. С одной стороны, мы уже достаточно грамотны, чтобы, оттолкнувшись от примитивов, хоть одним глазком взглянуть, а можно и кавалерийским наскоком - вопрос темперамента; но так или иначе затронуть по горячему следу и вопросы составных типов данных. Однако, С-образность Go в плане простоты перехода от примитивов к массивам и структурам (чем и исчерпывается дело), на практике довольно обманчива, ибо Go всё же более склонен к ООП-стилю мышления. И, во-вторых, Go синтаксически в достаточной мере настолько своеобразный язык, что проскочить рассмотрение синтаксиса "общим местом", как это могло было бы быть в чисто С-образном языке, не представляется возможным. Поэтому поступим со всей строгостью - сначала синтаксис от аза по самую ижицу, затем уж массивы, мапы, структуры, каналы и прочее разговение.

Не с этого следует начинать по-науке, но самая, пожалуй, неожиданная и непривычная особенность Go - это пустота в святая святых - отсутствие (ну, ладно, почти отсутствие), semicolon`a, доведенного до автоматизма каждым в профессии от школьника до пенсионера. Вот так просто - нету точки с запятой, и всё. Нет, я, конечно не мог немного не слукавить - роль знака ";" играет перенос строки. Что, в свою очередь, накладывает на этот самый перенос весомые ограничения. Будучи применён, он имеет своё семантическое значение. Итак, раскрыв одну из главных интриг, вернём речь в последовательно-повествовательное русло.

Объявление переменных.

Переменные могут быть объявлены тремя способами.

  • При помощи ключевого слова var (без паники, никакого JS, неявно типизированных переменных и так далее). Выглядит это так:

    • var i int

    • var str string

    • var f float64

    Как можно видеть, Go - язык с обратным синтаксическим расположением элементов - сперва имя переменной, затем её тип. Вышеуказанным способом переменные могут быть объявлены в любом месте кода программы - будь то как глобальные переменные, либо внутри любой функции или блока. Как правило, область видимости таких переменных максимальна. Будучи поименована с прописной буквы, переменная станет экспортируемой.

  • Второй способ отчасти deprecated.

package main

import "fmt"

var str string = "Hello, World!" //корректно, доходчиво, но избыточно

func main(){
    fmt.Println(str)
}

Этот способ связан с одновременным присвоением значения переменной в процессе её объявления. Способ вполне легитимный, кроме того, что некоторые инструменты-линтеры, такие как 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 - является в данном случае термином, описывающим это явление.

package main

import "fmt"

var str = "Hello, World!" //вполне достаточно, и линтеру приятно

func main(){
    fmt.Println(str)
}
  • Третий способ - краткий, при помощи специального символа :=

Не смотря на некоторую непривычность, на самом деле, сей знак используется во множестве, как выражаются профессиональные программисты, Algol-descended языках: Algol, Palsal, Modula, Smalltalk, Pico etc. Чёрт возьми, даже в MySQL можно написать пресловутое :=, что будет таки означать "assign value"!

В Go же сокращённым объявлением переменной можно воспользоваться лишь внутри функции или блока. Вот так:

package main

import "fmt"

func main(){
    str := "Hello, World!" //мы внутри функции main()!
    fmt.Println(str)
}

Nota bene!

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

Честности ради, есть ещё "трёхсполовиновый" способ объявления - "оптовый".

Он используется только с ключевым словом var и чаще тогда, когда мы ходим объявить сразу некий блок переменных. Нетрудно представить себе ситуацию, когда, мысля архитектурно, мы создаём в нашем пакете fqdn.org/utils некий файл objects.go подобного содержания:

package utils

var (
		i int
		b bool
		f float64
		s string
	)
//блочное объявленние переменных

Как видно, мы избавили себя от необходимости каждый раз писать ключевое слово var.

Следующая важнейшая вещь в синтаксисе Go - его, скажем прямо, насильственный минимализм. Компилятор не позволит вам подключить неиспользуемый пакет или объявить "впрок" избыточную переменную. И то и другое вызовет ошибку времени компиляции. Правила эти не обсуждаются, не обходятся и не лечатся хитростями. За исключением знака-местоблюстителя "_" (нижнее подчёркивание), который может быть использован как заместитель переменной (вместо неё), или же перед названием подключаемого пакета, который приходится подключать для совместимости (часто при работе с графикой и СУБД). Подробнее об этом мы сможем с вами поговорить, когда изучим функции, дабы не приводить несвоевременные, запутывающие примеры.

Комментарии

Куда же без них! Комментарии - это, пожалуй, для каждого учебника по программированию, есть та самая сущность, о которой читатель узнаёт (явно или неявно) с самого начала и часто несвоевременно. Поскольку буквально каждый пример не обходится без поясняющих (комментирующих) строк в теле кода данного примера. Благо, Go в этом плане мало чем похвалиться. Присутствуют стандартные строчные и блочные комментарии, привычные большинству:

//I am a simple comment
//I am another one

/*I am a large block comment, which utilizes 
some strings */

Но всё же попрошу немного вашего внимания! Комментарии в Go только кажутся простыми, аналогичными таковым в С/С++! Не забываем о том, что комментарии необходимы для описания экспортируемых переменных и функций (для чтения таких описаний используется утилита go doc). И, что требует более углублённого понимания, комментарии используются расширением CGO для генерации С-шных хедеров экспортируемых функций при создании *.SO библиотек средствами Go.

Импорт пакетов

Ещё минута вашего внимания. Здесь всё просто. Есть два способа - в строчку или в столбик. Иллюстрации будет достаточно.

package main
//1 способ
import ("fmt"; "log")
//алилуйя, мы встретили semicolon в значении переноса строки

import (
	"fmt"
	"log"
)
//2способ, традиционный

Как говорится, one more thing...

package main

import (
	. "fmt"
	/*точка, и, по обыкновению, за ней пробел, перед именем пакета, избавляют
	от необходимости указывать в тексте имя пакета. Однако, это не принято.
	*/
)

func main() {
	Println("Hello, World!")
}

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

Раунд!

PreviousАлфавит и пакетыNextПриведение типов

Last updated 4 years ago

Was this helpful?