- Объявлять переменные через
varи:=и объяснять разницу - Знать основные типы и их нулевые значения
- Явно преобразовывать типы и переводить строки в числа и обратно с помощью
strconv - Создавать константы с помощью
constиiota
Представь, что ты пишешь игру. Где хранить имя игрока, его очки, уровень и то, в сети ли он сейчас? В переменных. В Go у каждой переменной есть точный тип, и компилятор не позволит записать в неё неподходящее значение. В этом уроке ты научишься объявлять переменные и константы, познакомишься с основными типами и их преобразованием.
Объявление переменных
В Go переменную можно объявить двумя способами. Полная форма использует ключевое слово var: var age int = 14. Если значение задано, тип можно не писать — Go определит его сам. А внутри функций чаще всего применяют краткое объявление: city := "Baku". := создаёт новую переменную, а обычное = присваивает новое значение уже существующей.
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"var count int
var ready bool
title := "Go course"var count int уже равно 0. Если внутри функции нужно начальное значение, используй :=.Основные типы и нулевые значения
| Тип | Пример | Нулевое значение | Примечание |
|---|---|---|---|
int | 42, -7 | 0 | целое число; на 64-битных системах занимает 64 бита |
float64 | 3.14 | 0 | дробное число |
string | "Baku" | "" | текст в виде байтов UTF-8 |
bool | true, false | false | логическое значение |
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 не бывает переменных со «случайным мусором».
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 — строку в число.
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 и другие.
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 с каждой строкой. Это удобно для перечислений: размеров, дней недели или статусов.
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.
score после строки var score int?