#4 golang Переменные, константы, объявление и присваивание, блок var

Объявление переменных и присваивание им значений - разные варианты

В Го можно объявлять переменные и присваивать им значения:

package main

import (
  "fmt"
)

func main() {
  var power int
  power = 9000
  fmt.Printf("It's over %d\n", power)
}

- выше:

var power int

-- это именно объявление (присваивали же мы значение после), при этом можно как сразу же присвоить значение в момент объявления через var:

var power int = 9000

так и вообще не использовать var но использовать оператор объявления-присваивания "двоеточие равно":

power := 9000

-- тут мы даже не указываем тип, компилятор вычислит его на основе присваиваемого значения
(в Паскале, он, кстати, отвечает просто за присваивание)

При этом можно объявить и сразу несколько переменных под одним var:

var weight, height = 10, 20.5

-- тут две переменные и два значения для них.

Значения по умолчанию

Если при инициаллизации значения не указывать, то они сразу же получают некоторые значения по умолчанию:

package main

func main() {
    // значение по умолчанию 0
    var myNumber int
}

-- тут заметим, что если переменная объявления и не используется, то такой код не скопмилируется.

Объявление в блоке и область видимости на уровне пакета

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

package main

import "fmt"

// объявление нескольких переменных
var weight, height = 10, 20.5

// Объявление в блоке var
var (
	vasya       string  = "Vasya"
	petya       string  = "Petya"
	vasyaSalary int     = 100
	petyaSalary float32 // пока тут значение по умолачанию
/* неиспользуемые переменные можно объявлять в блоке, 
но не в функции:	*/
	unused      int 
)

func main() {
	var value = 123
	fmt.Printf("value = %v \n", value)
	// присваивание в существующие переменные
	weight, height = 11, 21

/* Чтобы использовать оператор := 
хотя бы одна переменная должна быть новой,
 а вот другие могут быть объявлены где-то еще: */
	weight, age := 16, "Молод"
	fmt.Println(weight, height, age)
	fmt.Printf("%v получил %v, а ", vasya, vasyaSalary)
	fmt.Printf("%v получил %v", petya, petyaSalary)
	petyaSalary = 120 // поменяе значение
	showNext()
}

// проверим доступность переменных, объявленных в блоке var
func showNext() {
	// тут
	fmt.Printf("\n %v получил %v", petya, petyaSalary)
	// А вот к локально для main() переменной value доступа нет
	// fmt.Printf("value = %v \n", value)
}

- если положить рядом (в той же папке) нашим основным файлов другой файл (с другим именем) но с указанием на принадлежность к тому же пакету и содержимым вроде (опять объвленин переменных через блок):

// принадлежит к тому же пакету, что и код выше
package main 

var (
	externalValue string = "Vasya"
)

- то значение externalValue будет доступно и в других файлах того же пакета, например showNext() из предпоследнего примера (можете проверить!)

Источники

В том числе использовали: