Переменные

Ранее в этой книге мы имели дело с литеральными значениями (числами, строками и т.д.), но программы с одними только литералами фактически бесполезны. Для того, чтобы сделать по-настоящему полезные программы, нам нужно узнать о двух важных вещах: переменных и инструкциях, управляющих ходом выполнения. В этой главе будут рассмотрены переменные.

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

package main

import "fmt"

func main() {
    var x string = "Hello World"
    fmt.Println(x)
}

Обратите внимание, что мы по-прежнему используем строковый литерал из оригинальной программы, но вместо того, чтобы напрямую передать его в функциюPrintln, мы присваиваем его переменной. Переменные в Go создаются с помощью ключевого словаvar, за которым следуют имя переменной (x), тип (string) и присваиваемое значение (Hello World). Последний шаг не обязателен, поэтому программа может быть переписана так:

package main

import "fmt"

func main() {
    var x string
    x = "Hello World"
    fmt.Println(x)
}

Переменные в Go похожи на переменные в алгебре, но есть несколько различий. Во-первых, когда мы видим символ=, то по привычке читаем его как «х равен строке Hello World». Нет ничего неверного в том, чтобы читать программу таким образом, но лучше читать это как «х принимает значение строки Hello World» или «x присваивается строка Hello World». Это различие важно потому, что переменные могут менять свои значения во время выполнения программы (как понятно по их названию). Попробуйте сделать следующее:

package main

import "fmt"

func main() {
    var x string
    x = "first"
    fmt.Println(x)
    x = "second"
    fmt.Println(x)
}

На самом деле вы можете сделать даже так:

var x string
x = "first "
fmt.Println(x)
x = x + "second"
fmt.Println(x)

Эта программа будет бессмысленной, если вы будете читать её как теорему из алгебры. Но она обретет смысл, если вы будете внимательно читать программу как список команд. Когда мы видимx = x + "second", то должны читать это так: «Присвоить конкатенацию значения переменной x и литерала строки переменной x». Операции справа от=выполняются первыми, и результат присваивается левой части.

Записьx = x + yнастолько часто встречается в программировании, что в Go есть специальный оператор присваивания+=. Мы можем записатьx = x + "second"какx += "second", и результат будет тем же (прочие операторы могут быть использованы подобным же образом).

Другое отличие между Go и алгеброй в том, что для равенства используется другой символ:==(два знака равно, один за другим).==- это оператор. Как и+, он возвращает логический тип. Например:

var x string = "hello"
var y string = "world"
fmt.Println(x == y)

Эта программа напечатаетfalse, потому чтоhelloотличается отworld. С другой стороны:

var x string = "hello"
var y string = "hello"
fmt.Println(x == y)

напечатаетtrue, потому что обе строки одинаковы.

Если мы хотим присвоить значение переменной при её создании, то можем использовать сокращенную запись:

x := "Hello World"

Обратите внимание на то, что:стоит перед=, и на отсутствие типа. Тип в данном случае указывать не обязательно, так как компилятор Go способен определить тип по литералу, которым мы инициализируем переменную. Тут мы присваиваем строку, поэтому x будет иметь типstring. Компилятор может определить тип и при использованииvar:

var x = "Hello World"

И так со всеми типами:

x := 5
fmt.Println(x)

В общем, желательно всегда использовать краткий вариант написания.

Как назвать переменную

Правильное именование переменных — важная часть разработки ПО. Имена должны начинаться с буквы и могут содержать буквы, цифры и знак _ (знак подчеркивания). Компилятору Go, в принципе, всё равно, как вы назовете переменную, но не забудьте, что вам (и может быть кому-то еще) потом это придется читать. Предположим, у нас есть:

x := "Max"
fmt.Println("My dog's name is", x)

В этом случаеxне самое лучшее имя переменной. Лучше было бы так:

name := "Max"
fmt.Println("My dog's name is", name)

или даже так:

dogsName := "Max"
fmt.Println("My dog's name is", dogsName)

В последнем случае мы использовали специальный способ написания имени переменной, состоящей из нескольких слов, известный как lower CamelCase (или camelBack). Первая буква первого слова записывается в нижнем регистре, первая буква последующих слов записывается в верхнем регистре, всё остальное - в нижнем.

Область видимости

Вернемся к программе, которую мы рассматривали в начале главы:

package main

import "fmt"

func main() {
    var x string = "Hello World"
    fmt.Println(x)
}

Эту программу можно записать следующим образом:

package main

import "fmt"

var x string = "Hello World"

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

Мы вынесли переменные за пределы функции main. Это означает, что теперь другие функции имеют доступ к этой переменной:

var x string = "Hello World"

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

func f() {
    fmt.Println(x)
}

Функцияfимеет доступ к переменнойx. Теперь предположим, что вместо этого мы написали:

func main() {
    var x string = "Hello World"
    fmt.Println(x)
}

func f() {
    fmt.Println(x)
}

Если вы попробуете выполнить эту программу, то получите ошибку:

.\main.go:11: undefined: x

Компилятор говорит вам, что переменнаяxвнутри функцииfне существует. Она существует только внутри функцииmain. Места, где может использоваться переменнаяx, называются областью видимости переменной. Согласно спецификации «в Go область видимости ограничена блоками». В основном это значит, что переменные существуют только внутри текущих фигурных скобок{}(в блоке), включая все вложенные скобки (блоки). Область видимости поначалу может запутать вас, но когда вы увидите больше примеров, то всё станет ясно.

Константы

Go также поддерживает константы. Константы — это переменные, чьи значения не могут быть изменены после инициализации. Они создаются таким же образом, как и переменные, только вместоvarиспользуется ключевое словоconst:

package main

import "fmt"

func main() {
    const x string = "Hello World"
    fmt.Println(x)
}

А вот этот код:

const x string = "Hello World"
x = "Some other string"

вызовет ошибку компиляции:

.\main.go:7: cannot assign to x

Константы — хороший способ использовать определенные значения в программе без необходимости писать их каждый раз. Например, константаPiиз пакетаmath.

Определение нескольких переменных

В Go существует еще одно сокращение на случай, если необходимо определить несколько переменных:

var (
    a = 5
    b = 10
    c = 15
)

Используя ключевые словоvar(илиconst), за которым идут круглые скобки с одной переменной в каждой строке.

Пример программы

package main

import "fmt"

func main() {
    fmt.Print("Enter a number: ")
    var input float64
    fmt.Scanf("%f", &input)

    output := input * 2

    fmt.Println(output)    
}

Тут мы используем другую функцию из пакетаfmt, чтобы считать пользовательский ввод (Scanf).&inputбудет объяснен в следующих главах, а все, что нам нужно знать сейчас, это то, чтоScanfзаполняет переменнуюinputчислом, введенным нами.

Задачи

  • Существуют два способа для создания новой переменной. Какие?

  • Какое будет значение уxпосле выполненияx := 5; x += 1?

  • Что такое область видимости и как определяется область видимости переменной в Go?

  • В чем отличиеvarотconst?

  • Используя пример программы выше напишите программу, переводящую температуру из градусов Фаренгейта в градусы Цельсия. (C = (F - 32) * 5/9)

  • Напишите другую программу для перевода футов в метры (1 фут = 0.3048 метр).

results matching ""

    No results matching ""