Предыдущая часть — типы данных.
Переменная является ни чем иным, как просто именем для области памяти, которой может манипулировать программа. Каждая переменная в Go имеет свой тип, который определяет размер памяти и расположение выделенной для переменной области памяти в адресном пространстве процесса, диапазон значений, которое она может принимать, и типы операций, которые могут быть применены к этой переменной.
Имя переменной может состоять из букв, цифр и символов подчёркивания, при этом начинаться имя должно либо с буквы, либо со знака подчёркивания. Кроме того Go является регистрозависимым языком.
Содержание
Базовые типы переменных
Основываясь на базовых типах данных, рассмотренных в предыдущей части — в Go имеются следующие базовые типы переменных:
| Sr.No | Type & Description |
|---|---|
| 1 | byte
один октет (один байт, 8 бит) |
| 2 | int
ineteger для для конкретной машины |
| 3 | float32
число с плавающей точкой одинарной точности |
Go также позволяет задавать различные другие типы переменных, такие как перечисления (Enumeration), указатели (Pointer), массивы (Array), стуктуры (Structure) и объединения (Union), которые мы рассмотрим в следующих частях. В этой части — сосредоточимся на базовых типах.
Определение переменной в Go
Определение, или описание, (definition) указывает компилятору на необходимость создать хранилище для переменной с определённым размером и расположением. В определении указывается тип данных и список из одной или более имён переменных:
var variable_list optional_data_type;
Тут optional_data_type является типом данных Go, таким как byte, int, float32 и т.д., а variable_list может содержать идентификаторы переменных (имена), разделённых запятыми.
Примеры определений переменных:
var i, j, k int; var c, ch byte; var f, salary float32; d = 42;
В строке «var i, j, k;» описываются переменные i, j и k, что указывает компилятору на необходимость создания таких перменных с типом int(eger).
Переменные могут быть проиницииализированы (выполнено присваивание значения) во время её объявления. Тип переменной может быть автоматически задан компилятором на основе данных, которые присваиваются переменной.
Инициализация выполняется с помощью символа равенства с последующей константой:
variable_name = value;
Например:
d = 3, f = 5; // объявление переменных d и f. типа integer
Статическая типизация в Go
Статическая типизация позволяет гарантировать компилятору, что переменная будет иметь только один тип и имя, так что компилятор может продолжить выполнение компиляции без необходимости выполнять запрос всех данных переменной. Объявление переменной играет роль только на стадии компиляции.
Пример:
package main
import "fmt"
func main() {
var x float64
x = 20.0
fmt.Println(x)
fmt.Printf("x is of type %T\n", x)
}
Результат выполнения:
$ go run static_dec.go 20 x is of type float64
Динамическая типизация в Go
Динамическая типизация потребует от компилятора выполнить интерпретацию типа данных самому, основываясь на данных, которые переданы переменной. Компилятор Go не требует обязательного объявления типа данных.
Пример:
package main
import "fmt"
func main() {
var x float64 = 20.0
y := 42
fmt.Println(x)
fmt.Println(y)
fmt.Printf("x is of type %T\n", x)
fmt.Printf("y is of type %T\n", y)
}
Обратите внимание, что инициализация y выполняется с помощью оператора :=, тогда как x — с помощью знака равенства.
Результат выполнения этого кода:
$ go run dynam_dec.go 20 42 x is of type float64 y is of type int
Смешанное объявление в Go
Вы так же можете выполнить объявление нескольких переменных различных типов одной строкой, например:
package main
import "fmt"
func main() {
var a, b, c = 3, 4, "foo"
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
fmt.Printf("a is of type %T\n", a)
fmt.Printf("b is of type %T\n", b)
fmt.Printf("c is of type %T\n", c)
}
Результат выполнения:
$ go run mixed_decl.go 3 4 foo a is of type int b is of type int c is of type string
lvalues и rvalues в Go
В Go есть два типа выражений:
- lvalue − выражение, которое ссылается на какой-то явный участок памяти называется «lvalue» («Locator value«), при этом выражение может находится с любой стороны от оператора присваивания.
- rvalue − термин r-value («Raw value«?) применяется к данным, которые хранятся в каком-то участке памяти.
Переменные являются l-values, и могут указываться с левой стороны (тем не менее — не «left-value«, а «locator value«). Числовые литералы, в свою очередь, являются r-values, и не могут быть присвоены к чему-либо, и не должны быть указаны с левой стороны от оператора присваивания.
Т.е. следующее выражение будет корректным:
x = 20.0
Тогда как следующее вызовет ошибку компилятора:
10 = 20
[simterm]
$ go run mixed_decl.go # command-line-arguments ./mixed_decl.go:7:7: cannot assign to 10
[/simterm]
Продолжение — часть 5 – константы.
4 530 views