День 02 · Переменные и присваивание · страница 1 из 6

Переменная — ячейка с именем

Вчера программы печатали готовый текст. Настоящей программе этого мало: остаток товара меняется весь день, и программа должна запомнить число, поменять его и показать текущее. Для этого нужны переменные.

Главный приём дня — трассировка: выполнять программу в голове строка за строкой, как её выполняет компьютер, и записывать значения в таблицу.


Ячейка с именем

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

Переменная — именованная ячейка памяти, в которой лежит значение.

Образец · набирать не нужно
          ┌──────┐
  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 — черновик для опытов.

  1. Откройте модуль в редакторе:
▶ Выполните
code ~/gocourse/day02
  1. Сотрите заготовку в scratch/main.go, наберите программу выше руками и сохраните:
✎ Наберите в файл scratch/main.go
package main

import "fmt"

func main() {
	var stock int = 40
	fmt.Println("Остаток:", stock)
}
  1. Запустите:
▶ Выполните
cd ~/gocourse/day02/scratch
go run .
Вывод · это печатает программа, набирать не нужно
Остаток: 40
  1. Поменяйте 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: price

declared 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 не собирается. Что она должна напечатать — в комментарии в начале файла.

  1. Запустите и прочитайте сообщение компилятора:
▶ Выполните
cd ~/gocourse/day02/fix1
go run .
  1. Компилятор назвал переменную, которая не используется. Сравните комментарий с тем, что печатает программа: где эту переменную собирались использовать? Здесь хватает одной строки; проверка принимает не больше двух — тот же лимит записан в course lab 02. Сохраните и запустите go run . снова.
  2. Новое сообщение — строкой в ~/errors.md, как вчера: текст ошибки, тире, что это значило. К концу дня в словарике должно быть минимум пять разборов — всего, вместе со вчерашними из дня 01.

Готово, когда: go run . печатает три строки из комментария — пункт проверки fix1; в ~/errors.md новая строка с тире.


Дальше: короткое объявление := — course next