Урок 2 из 8 · 20 мин · обновлено
Переменные, типы и константы
Как объявлять переменные через var и :=, какие бывают базовые типы, что такое нулевые значения, почему Go не складывает int и float64 и как форматировать вывод.
Как объявить переменную
Переменная — это имя, под которым программа хранит значение. В 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.
Если переменной не дали значение, она получает нулевое значение своего типа:
var count int
var title string
var done bool
fmt.Println(count, title, done)
0 false
Между 0 и false два пробела: там выведена пустая строка. В Go не бывает переменной «без значения», поэтому программа не упадёт из-за того, что вы забыли что-то присвоить.
Строгая типизация
Go не смешивает типы сам. Попробуем умножить целое число на дробное:
price := 450
weight := 1.5
fmt.Println(price * weight)
invalid operation: price * weight (mismatched types int and float64)
Программа даже не соберётся. Тип нужно привести явно — записать его имя и значение в скобках:
fmt.Println(float64(price) * weight)
675
Это защищает от тихих ошибок: вы всегда видите, где число становится дробным, а где округляется.
С делением та же логика. Если оба числа целые, деление целочисленное, а остаток можно получить через %:
fmt.Println(7 / 2)
fmt.Println(7.0 / 2)
fmt.Println(7 % 2)
3
3.5
1
И ещё одно правило: переменная, которую создали, но не использовали, — ошибка компиляции declared and not used. Как и с импортами, это защита от мусора в коде.
Константы и форматированный вывод
Константа — значение, которое не меняется. Её объявляют через const, можно и вне функции:
const discountPercent = 10
Когда нужно вывести фразу с числами в нужном виде, используют fmt.Printf. В строке шаблона ставят заполнители, а значения перечисляют после неё:
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 ₽.
Решение
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 сам подстраивает под выражение, поэтому её можно использовать с дробными числами.
Мини-тест: проверьте себя
Закрепите урок: несколько вопросов, разбор ответов — в конце.
-
Что сделает строка city := "Казань" внутри функции?
Короткое объявление := создаёт переменную и само определяет тип по значению. Здесь значение в кавычках, значит тип string.
-
Какое значение будет у переменной var count int, если ничего ей не присвоить?
В Go у каждой переменной сразу есть нулевое значение: у чисел 0, у строк пустая строка, у bool — false.
-
price := 450, weight := 1.5. Что будет при попытке посчитать price * weight?
Go не приводит типы сам. Нужно явно превратить целое число в дробное: float64(price) * weight.
-
Что выведет fmt.Println(7 / 2)?
Оба числа целые, поэтому деление целочисленное: дробная часть отбрасывается. Чтобы получить 3.5, нужно делить дробные числа: 7.0 / 2.
-
Можно ли изменить значение константы const discountPercent = 10 позже в программе?
Константа задаётся один раз и не меняется. Так защищают значения, которые не должны случайно поменяться: ставки, лимиты, коэффициенты.