Перейти к содержанию
Educora
Начальный14 мин2 / 10

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

Объявляй переменные через `var` и `:=`, изучи основные типы, нулевые значения, преобразования типов, строки и константы с `iota`.

Проверь себя
В этом уроке ты узнаешь
  • Объявлять переменные через var и := и объяснять разницу
  • Знать основные типы и их нулевые значения
  • Явно преобразовывать типы и переводить строки в числа и обратно с помощью strconv
  • Создавать константы с помощью const и iota

Представь, что ты пишешь игру. Где хранить имя игрока, его очки, уровень и то, в сети ли он сейчас? В переменных. В Go у каждой переменной есть точный тип, и компилятор не позволит записать в неё неподходящее значение. В этом уроке ты научишься объявлять переменные и константы, познакомишься с основными типами и их преобразованием.

Объявление переменных

В Go переменную можно объявить двумя способами. Полная форма использует ключевое слово var: var age int = 14. Если значение задано, тип можно не писать — Go определит его сам. А внутри функций чаще всего применяют краткое объявление: city := "Baku". := создаёт новую переменную, а обычное = присваивает новое значение уже существующей.

Go
package main

import "fmt"

func main() {
	var name string = "Leyla"
	var age = 14
	city := "Baku"
	x, y := 3, 4
	age = age + 1
	x, y = y, x
	fmt.Println(name, age, city)
	fmt.Println(x, y)
}
Ожидаемый результат
Leyla 15 Baku
4 3
Слишком многословно
var count int = 0
var ready bool = false
var title string = "Go course"
Идиоматичный Go
var count int
var ready bool
title := "Go course"
Если нужно нулевое значение, не пиши его — var count int уже равно 0. Если внутри функции нужно начальное значение, используй :=.

Основные типы и нулевые значения

ТипПримерНулевое значениеПримечание
int42, -70целое число; на 64-битных системах занимает 64 бита
float643.140дробное число
string"Baku"""текст в виде байтов UTF-8
booltrue, falsefalseлогическое значение
rune'ə'0один символ Unicode (другое имя int32)
byte'A'0один байт (другое имя uint8)

Кроме того, есть типы с явно заданным размером: int8, int16, int32, int64, беззнаковые uint, uint8… и float32. В повседневном коде обычно хватает int, float64, string и bool.

Определение
Нулевое значение

Значение, которое переменная получает автоматически, если её объявили без значения: 0 для чисел, пустая строка "" для строк, false для bool и nil для указателей, срезов и map. В Go не бывает переменных со «случайным мусором».

Go
package main

import "fmt"

func main() {
	var n int
	var f float64
	var s string
	var ok bool
	fmt.Println(n, f, ok)
	fmt.Printf("%q\n", s)
	fmt.Printf("%T %T %T %T\n", 42, 2.5, "hi", 'A')
}
Ожидаемый результат
0 0 false
""
int float64 string int32

%q выводит строку в кавычках — так пустую строку легко заметить. Обрати внимание: 'A' в одинарных кавычках — не строка, а руна (rune), то есть номер символа в Unicode. Поэтому её тип выводится как int32. Дробное число без указания типа (2.5) всегда становится float64.

Преобразования типов и арифметика

Go никогда не преобразует типы незаметно: сложить int и float64 напрямую нельзя. Преобразование записывается явно: float64(a), int(x). Деление двух целых чисел даёт целое — дробная часть отбрасывается, а % даёт остаток. Для преобразований между строками и числами есть пакет strconv: Itoa превращает число в строку, а Atoi — строку в число.

Go
package main

import (
	"fmt"
	"strconv"
)

func main() {
	a, b := 7, 2
	fmt.Println(a/b, a%b)
	fmt.Println(float64(a) / float64(b))
	price := 2.5
	fmt.Println(price * float64(a))
	s := strconv.Itoa(a) + " apples"
	fmt.Println(s)
	n, err := strconv.Atoi("42")
	fmt.Println(n+1, err)
}
Ожидаемый результат
3 1
3.5
17.5
7 apples
43 <nil>

Atoi возвращает два значения: число и ошибку. При успешном преобразовании ошибка равна nil, и Println выводит её как <nil>. Работу с ошибками ты подробно изучишь в отдельном уроке.

Строки и символы

В Go строка — неизменяемая последовательность байтов, а текст хранится в кодировке UTF-8. Латинские буквы занимают один байт, а буквы вроде ə, ş и ı — два. Поэтому len возвращает количество байтов, а не символов. Чтобы посчитать символы, есть функция RuneCountInString из пакета unicode/utf8. В пакете strings много готовых инструментов: ToUpper, Contains, Replace, Split, TrimSpace и другие.

Go
package main

import (
	"fmt"
	"strings"
	"unicode/utf8"
)

func main() {
	city := "Gəncə"
	fmt.Println(len(city), utf8.RuneCountInString(city))
	fmt.Println(strings.ToUpper(city), strings.Contains(city, "ncə"))
	msg := "Welcome to " + city + "!"
	fmt.Println(msg)
	fmt.Println(strings.Replace(msg, "Welcome to", "Hello from", 1))
	fmt.Println(strings.Repeat("=", 10))
}
Ожидаемый результат
7 5
GƏNCƏ true
Welcome to Gəncə!
Hello from Gəncə!
==========

Константы и iota

Константа объявляется через const и не может меняться во время работы программы. Константы вычисляются при компиляции, поэтому их значением может быть только что-то простое: число, строка или bool. В группе констант в скобках iota — счётчик, который начинается с 0 и растёт на 1 с каждой строкой. Это удобно для перечислений: размеров, дней недели или статусов.

Go
package main

import "fmt"

const Pi = 3.14159

const (
	Small = iota
	Medium
	Large
)

func main() {
	const greeting = "Hello"
	r := 2.0
	fmt.Println(greeting, Pi*r*r)
	fmt.Println(Small, Medium, Large)
}
Ожидаемый результат
Hello 12.56636
0 1 2

Главное

  • var x int = 5 — полная форма, x := 5 — краткое объявление внутри функции; = только присваивает значение существующей переменной.
  • Переменная, объявленная без значения, получает нулевое значение: 0, "", false или nil.
  • Go не преобразует типы автоматически: пиши float64(a), int(x); целочисленное деление отбрасывает дробную часть.
  • strconv.Itoa и strconv.Atoi переводят числа в строки и обратно; len считает байты строки, а utf8.RuneCountInString — символы.
  • const объявляет неизменяемое значение; iota — счётчик в группе констант, начинающийся с 0.

Проверь себя

Вопросов: 10. Каждый правильный ответ приносит XP.

1 / 10
Чему равно score после строки var score int?