Unetway

Go - Переменные

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

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

byte

Обычно один октет (один байт). Это байтовый тип.

int

Самый естественный размер целого для машины.

float32

Значение с плавающей запятой с одиночной точностью.

Язык программирования Go также позволяет определять различные другие типы переменных, такие как Enumeration, Pointer, Array, Structure и Union.

Определение переменной в Go

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

var variable_list optional_data_type;

Здесь optional_data_type - это действительный тип данных Go, включая байты, int, float32, complex64, boolean или любой пользовательский объект и т. Д., А переменная_list может состоять из одного или нескольких имен идентификаторов, разделенных запятыми. Некоторые действительные объявления показаны здесь:

var  i, j, k int;
var  c, ch byte;
var  f, salary float32;
d =  42;

Утверждение «var i, j, k;» объявляет и определяет переменные i, j и k; который инструктирует компилятор создавать переменные с именем i, j и k типа int.

Переменные могут быть инициализированы (назначены начальное значение) в их объявлении. Тип переменной автоматически оценивается компилятором на основе переданного ему значения. Инициализатор состоит из знака равенства, за которым следует постоянное выражение следующим образом:

variable_name = value;

d = 3, f = 5;

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

Декларация статического типа в 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)
}

Когда приведенный выше код компилируется и выполняется, он производит следующий результат:

20
x is of type float64

Объявление динамического типа/вывод типа в Go

Объявление переменной динамического типа требует, чтобы компилятор интерпретировал тип переменной на основе переданного ей значения. Компилятор не требует, чтобы переменная имела тип статически как необходимое требование.

Попробуйте следующий пример, где переменные были объявлены без какого-либо типа. Обратите внимание, что в случае вывода типа мы инициализировали переменную y с помощью оператора: =, тогда как xинициализируется с помощью = operator.

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)	
}

Когда приведенный выше код компилируется и выполняется, он производит следующий результат:

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)
}

Когда приведенный выше код компилируется и выполняется, он производит следующий результат:

3
4
foo
a is of type int
b is of type int
c is of type string

Lvalues ​​и rvalues ​​в Go

Существует два вида выражений в Go:

  • lvalue. Выражения, относящиеся к ячейке памяти, называются выражениями «lvalue». Значение l может отображаться как в левой, так и в правой части задания.
  • rvalue - термин rvalue относится к значению данных, которое хранится на некотором адресе в памяти. Rvalue - это выражение, которое не может иметь назначенное ему значение, что означает, что rvalue может отображаться в правой, но не левой части задания.

Переменные являются lvalues ​​и поэтому могут отображаться в левой части задания. Числовые литералы являются значениями r и поэтому не могут быть назначены и не могут появляться с левой стороны.

x = 20.0

Следующий оператор недействителен. Это приведет к ошибке времени компиляции:

10 = 20