Переменная — ячейка с именем
Вчера программы печатали готовый текст. Настоящей программе этого мало: остаток товара меняется весь день, и программа должна запомнить число, поменять его и показать текущее. Для этого нужны переменные.
Главный приём дня — трассировка: выполнять программу в голове строка за строкой, как её выполняет компьютер, и записывать значения в таблицу.
Ячейка с именем
Память компьютера — длинный ряд ячеек, у каждой свой номер. Помнить номера человеку неудобно, поэтому в языке программирования ячейке дают имя.
Переменная — именованная ячейка памяти, в которой лежит значение.
┌──────┐
stock │ 40 │ тип int — целое число
└──────┘
имя значение| Свойство | Что это | Пример |
|---|---|---|
| имя | как обращаться к ячейке в коде | stock |
| тип | какие значения в ней могут лежать | int — целые числа |
| значение | что лежит в ней сейчас | 40 |
Имя и тип задаются один раз. Значение можно менять сколько угодно — поэтому ячейка и называется переменной.
Объявление: var
Ситуация. Программа печатает остаток товара. Число нужно где-то хранить, чтобы потом менять и печатать.
package main
import "fmt"
func main() {
var stock int = 40
fmt.Println("Остаток:", stock)
}Что увидите.
stagiaire@lab:~/gocourse/day02/scratch$ go run .
Остаток: 40Как это читать.
| Кусок | Что значит |
|---|---|
var |
«объявляю переменную» — от variable |
stock |
имя; по-английски «запас, остаток» |
int |
тип: целое число — от integer |
= 40 |
положить в ячейку начальное значение 40 |
Объявление выполняется как любая строка main, по порядку: на строке 6 появляется ячейка stock со значением 40. В строке 7 Println получает не имя, а значение — Go подставляет вместо stock содержимое ячейки. "Остаток:" в кавычках — готовый текст, stock без кавычек — имя переменной.
Попробуйте сейчас: наберите и запустите программу.
Цель: программа в
scratchпечатает остаток из переменной, и видно, что вывод меняется вместе со значением.В модуле дня есть папка
scratchс заготовкойmain.go— черновик для опытов.
- Откройте модуль в редакторе:
▶ Выполнитеcode ~/gocourse/day02
- Сотрите заготовку в
scratch/main.go, наберите программу выше руками и сохраните:✎ Наберите в файлscratch/main.gopackage main import "fmt" func main() { var stock int = 40 fmt.Println("Остаток:", stock) }
- Запустите:
▶ Выполнитеcd ~/gocourse/day02/scratch go run .Вывод · это печатает программа, набирать не нужноОстаток: 40
- Поменяйте 40 на другое число, сохраните и запустите
go run .снова: строка сPrintlnта же, а напечаталось другое.Готово, когда: первый запуск напечатал
Остаток: 40, второй — ваше число; запуск засчитан в пункте проверкиt_gorun.
Два типа на сегодня: int и string
| Тип | Что хранит | Примеры значений |
|---|---|---|
int |
целое число, в том числе ноль и отрицательные | 40, 0, -3, 150000 |
string |
строку — текст в двойных кавычках | "Болт М6", "" |
package main
import "fmt"
func main() {
var item string = "Болт М6"
var stock int = 40
fmt.Println("Товар:", item)
fmt.Println("Остаток:", stock)
fmt.Println(item, stock)
}stagiaire@lab:~/gocourse/day02/scratch$ go run .
Товар: Болт М6
Остаток: 40
Болт М6 40Тип закрепляется за переменной навсегда: в ячейку int нельзя положить текст, в string — число, и компилятор проверит это до запуска. Остальные типы — завтра, в день 03. Цены в курсе хранятся в копейках как int: 1500 рублей — это 150000.
Нулевые значения
Ситуация. Счётчик продаж в начале дня — ноль. Значение можно не писать.
package main
import "fmt"
func main() {
var stock int
var item string
fmt.Println("Остаток:", stock)
fmt.Print("Товар: [", item, "]\n")
}stagiaire@lab:~/gocourse/day02/scratch$ go run .
Остаток: 0
Товар: []Как это читать. Без значения Go кладёт в ячейку нулевое значение её типа:
| Тип | Нулевое значение |
|---|---|
int |
0 |
string |
"" — пустая строка, ни одного символа |
Пустую строку на экране не видно, поэтому она напечатана между скобками: Print склеил "Товар: [", пустую строку и "]\n". В Go у переменной всегда есть значение — случайного мусора из памяти, как в некоторых языках, не бывает.
Попробуйте сейчас: нулевое значение в своей программе.
Цель: увидеть нулевое значение
intв выводе своей программы.В
scratch/main.goобъявите название товара (string) и остаток (int) со значениями, а число продаж (int) — без начального значения. Напечатайте все три с подписями и запустите:▶ Выполнитеcd ~/gocourse/day02/scratch go run .Эти три объявления понадобятся на следующей странице, поэтому оставьте их в файле. Черновик проверка не смотрит.
Готово, когда: программа собралась и напечатала три строки с подписями: товар и остаток — те, что вы написали, продажи — как
0.
Что может пойти не так
Объявили и не используете
package main
import "fmt"
func main() {
var stock int = 40
var price int = 1200
fmt.Println("Остаток:", stock)
}stagiaire@lab:~/gocourse/day02/scratch$ go run .
# day02/scratch
./main.go:7:6: declared and not used: pricedeclared and not used — «объявлена и не используется». В Go это ошибка, а не предупреждение: переменная, которую ни разу не прочитали, почти всегда значит, что в программе что-то забыли. Вчерашнее imported and not used — то же правило для пакетов.
Опечатка в имени
package main
import "fmt"
func main() {
var stock int = 40
fmt.Println("Остаток:", stok)
}stagiaire@lab:~/gocourse/day02/scratch$ go run .
# day02/scratch
./main.go:6:6: declared and not used: stock
./main.go:7:33: undefined: stokКомпилятор видит два разных имени: stock не используется, stok не объявлена. Первое сообщение здесь — следствие, а не причина, поэтому прочитайте оба, прежде чем править. Исправление одно: stok → stock.
| Что видите | Что это значит | Что делать |
|---|---|---|
declared and not used: price |
переменная объявлена, но её значение нигде не читается | использовать её или удалить объявление |
undefined: stok |
такого имени нет: опечатка или переменную не объявили | сравнить имя с объявлением буква в букву |
cannot use "40" (untyped string constant) as int value in variable declaration |
в ячейку int кладут строку: var stock int = "40" |
число пишется без кавычек |
cannot use 40 (untyped int constant) as string value in variable declaration |
в ячейку string кладут число: var item string = 40 |
текст пишется в кавычках |
declared and not used: stock, хотя в Println есть "stock" |
имя в кавычках — уже текст, а не переменная | убрать кавычки вокруг имени |
untyped string constant — «строковая константа без типа»: так компилятор называет значение, написанное прямо в коде.
Попробуйте сейчас: почините программу
fix1.Цель:
fix1собирается и печатает то, что обещано в комментарии, а в словарике появился новый разбор.Программа
fix1не собирается. Что она должна напечатать — в комментарии в начале файла.
- Запустите и прочитайте сообщение компилятора:
▶ Выполнитеcd ~/gocourse/day02/fix1 go run .
- Компилятор назвал переменную, которая не используется. Сравните комментарий с тем, что печатает программа: где эту переменную собирались использовать? Здесь хватает одной строки; проверка принимает не больше двух — тот же лимит записан в
course lab 02. Сохраните и запуститеgo run .снова.- Новое сообщение — строкой в
~/errors.md, как вчера: текст ошибки, тире, что это значило. К концу дня в словарике должно быть минимум пять разборов — всего, вместе со вчерашними из дня 01.Готово, когда:
go run .печатает три строки из комментария — пункт проверкиfix1; в~/errors.mdновая строка с тире.
Дальше: короткое объявление := — course next