Прежде чем писать настоящие программы, нужно понять, как Go работает с данными. Данные в Go — это значения определённых типов: числа, строки, логические значения и многое другое. Чтобы с ними работать, мы используем переменные — именованные области памяти, в которых хранятся значения.
🔤 Типы данных в Go
Go — статически типизированный язык. Это означает, что тип переменной известен на этапе компиляции и не может измениться в процессе выполнения программы.
🔢 Числовые типы
Целые числа:
int
,int8
,int16
,int32
,int64
uint
,uint8
(илиbyte
),uint16
,uint32
,uint64
Числа с плавающей точкой:
float32
,float64
Комплексные числа:
complex64
,complex128
var a int = 10
var b uint8 = 255
var c float64 = 3.14
var d complex64 = 2 + 3i
💡 В чём отличия int от uint?
int может хранить как положительные, так и отрицательные числа (например, -10, 0, 42), а uint — только положительные (unsigned integer - беззнаковое число), но с удвоенным верхним пределом. Используй uint, если заранее знаешь, что переменная не будет принимать отрицательные >значения, например, счётчик или индекс.
🔍 Что означают числа в типах int8, uint32 и т. д.?
Число в конце типа указывает на размер в битах, который выделяется для хранения значения:
int8 — 8 бит
→ диапазон от -128 до 127
uint8 — 8 бит
→ от 0 до 255
int16 — 16 бит
→ от -32 768 до 32 767
int32 — 32 бита
→ от -2,147,483,648 до 2,147,483,647
uint32
— от 0 до 4,294,967,295
int64, uint64
— используются для очень больших чисел
Чем больше битов — тем больше диапазон значений, но и выше потребление памяти. Обычно достаточно использовать int, если нет особых требований.
🔡 Строки
var message string = "Привет, Go!"
Строки — это неизменяемые последовательности байт. В Go они представлены в кодировке UTF-8.
✅ Булевы значения
var isReady bool = true
bool
может принимать только два значения: true
или false
.
🕳 Специальный тип rune
rune
— это псевдоним для int32
, используется для представления символов Unicode:
var symbol rune = 'Ж'
📝 Объявление переменных
Переменные в Go можно объявлять несколькими способами.
Способ 1: Использование var
var x int = 10
var name string = "Go"
var active bool // значение по умолчанию: false
Можно опустить указание типа, если значение явно задано:
var city = "Москва" // Go сам выведет тип string
Способ 2: Краткая форма :=
count := 5
language := "Go"
success := true
💡
:=
— это синтаксический сахар, удобный для быстрой инициализации переменных. Он:
- Используется только внутри функций.
- Требует обязательной инициализации (значения не может не быть).
- Go автоматически определяет тип на основе значения справа.
pi := 3.1415 // float64
name := "Гоша" // string
ok := false // bool
💡 Под капотом
x := 10
эквивалентноvar x int = 10
.
🛠 Константы
Константы объявляются с помощью ключевого слова const
и не могут изменяться после определения:
const pi float64 = 3.14159
const appName = "MyApp"
Константы полезны для значений, которые не должны меняться, например, математические константы или имена приложений. Их тип можно опустить, если значение задано явно:
const maxRetries = 3 // Go выведет тип int
🧪 Пример
package main
import "fmt"
const (
gravity = 9.81 // ускорение свободного падения, м/с²
distance = 100 // расстояние, м
)
func main() {
time := float64(distance) / gravity
fmt.Printf("Время падения: %.2f секунд\n", time)
}
📦 Значения по умолчанию
Если переменная объявлена через var
, но не инициализирована, она получает значение по умолчанию:
Тип | Значение по умолчанию |
---|---|
int | 0 |
float64 | 0.0 |
string | "" (пустая строка) |
bool | false |
pointer | nil |
🧪 Пример
package main
import "fmt"
func main() {
var age int = 28
name := "Анна"
score := 95.5
var passed bool = true
fmt.Println("Имя:", name)
fmt.Println("Возраст:", age)
fmt.Println("Оценка:", score)
fmt.Println("Сдала экзамен?", passed)
}
Результат:
Имя: Анна
Возраст: 28
Оценка: 95.5
Сдала экзамен? true
🔄 Преобразование типов
В Go нет автоматического преобразования типов. Чтобы преобразовать один тип в другой, используйте явное приведение:
var i int = 42
var f float64 = float64(i)
var u uint = uint(f)
fmt.Println(f) // 42.0
💡 Будьте осторожны: преобразование может привести к потере данных (например, при приведении
float64
кint
дробная часть отбрасывается).
🚫 Типичные ошибки
Ошибка: Использование :=
вне функции.
package main
count := 10 // Ошибка: := можно использовать только внутри функций
Исправление:
var count = 10 // Используйте var для глобальных переменных
Ошибка: Попытка сложения переменных разных типов.
var i int = 42
var f float64 = 3.14
result := i + f // Ошибка: типы несовместимы
Исправление:
result := float64(i) + f // Приведение int к float64
fmt.Println(result) // 45.14
🧠 Проверь свои знания
- Назови как минимум три вида числовых типов в Go и их отличия.
- В чём разница между
var
и:=
? - Что произойдёт, если объявить переменную через
var
, но не задать ей значение? - Что такое
rune
и зачем он нужен? - Напиши программу, которая объявляет переменные разных типов и выводит их значения.
- Попробуй преобразовать
float64
вint
и объясни, что происходит с дробной частью.