Урок 2 из 8 · 20 мин · обновлено

Переменные, типы и константы

Как объявлять переменные через var и :=, какие бывают базовые типы, что такое нулевые значения, почему Go не складывает int и float64 и как форматировать вывод.

Как объявить переменную

Переменная — это имя, под которым программа хранит значение. В Go есть два способа её создать:

Go
var name string = "Анна"
var age = 25
city := "Казань"
fmt.Println(name, age, city)
Результат
Анна 25 Казань
  • var name string = "Анна" — полная запись: ключевое слово var, имя, тип и значение;
  • var age = 25 — тип можно не писать, Go определит его по значению;
  • city := "Казань" — короткое объявление. Самый частый вариант, но работает только внутри функций.

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

Базовые типы

У каждой переменной в Go есть тип, и после объявления он не меняется. Для начала хватит четырёх:

  • int — целые числа: 25, -3, 1000;
  • float64 — дробные числа: 1.5, 99.9;
  • string — строки: "Анна";
  • bool — логическое значение: true или false.

Если переменной не дали значение, она получает нулевое значение своего типа:

Go
var count int
var title string
var done bool
fmt.Println(count, title, done)
Результат
0  false

Между 0 и false два пробела: там выведена пустая строка. В Go не бывает переменной «без значения», поэтому программа не упадёт из-за того, что вы забыли что-то присвоить.

Строгая типизация

Go не смешивает типы сам. Попробуем умножить целое число на дробное:

Go
price := 450
weight := 1.5
fmt.Println(price * weight)
Результат
invalid operation: price * weight (mismatched types int and float64)

Программа даже не соберётся. Тип нужно привести явно — записать его имя и значение в скобках:

Go
fmt.Println(float64(price) * weight)
Результат
675

Это защищает от тихих ошибок: вы всегда видите, где число становится дробным, а где округляется.

С делением та же логика. Если оба числа целые, деление целочисленное, а остаток можно получить через %:

Go
fmt.Println(7 / 2)
fmt.Println(7.0 / 2)
fmt.Println(7 % 2)
Результат
3
3.5
1

И ещё одно правило: переменная, которую создали, но не использовали, — ошибка компиляции declared and not used. Как и с импортами, это защита от мусора в коде.

Константы и форматированный вывод

Константа — значение, которое не меняется. Её объявляют через const, можно и вне функции:

Go
const discountPercent = 10

Когда нужно вывести фразу с числами в нужном виде, используют fmt.Printf. В строке шаблона ставят заполнители, а значения перечисляют после неё:

Go
name := "Анна"
age := 25
fmt.Printf("%s, %d лет\n", name, age)
fmt.Printf("Итого: %.2f ₽\n", 1234.5)
fmt.Printf("%v %T\n", name, 1.5)
Результат
Анна, 25 лет
Итого: 1234.50 ₽
Анна float64
  • %s — строка, %d — целое число;
  • %.2f — дробное число с двумя знаками после запятой;
  • %v — любое значение в обычном виде, %T — его тип;
  • \n — перевод строки: Printf, в отличие от Println, сам его не ставит.

Попробуйте сами. Чашка кофе стоит 350.0 рублей, в заказе 4 чашки, скидка — константа 10%. Посчитайте сумму к оплате и выведите её с двумя знаками после запятой: К оплате: 1260.00 ₽.

Решение
Go
package main

import "fmt"

const discountPercent = 10

func main() {
	price := 350.0
	qty := 4
	total := price * float64(qty)
	total = total * (100 - discountPercent) / 100
	fmt.Printf("К оплате: %.2f ₽\n", total)
}
Результат
К оплате: 1260.00 ₽

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

Мини-тест: проверьте себя

Закрепите урок: несколько вопросов, разбор ответов — в конце.

  1. Что сделает строка city := "Казань" внутри функции?

  2. Какое значение будет у переменной var count int, если ничего ей не присвоить?

  3. price := 450, weight := 1.5. Что будет при попытке посчитать price * weight?

  4. Что выведет fmt.Println(7 / 2)?

  5. Можно ли изменить значение константы const discountPercent = 10 позже в программе?