Переменные и типы данных в Go: просто и эффективно

В этом уроке мы погрузимся в мир переменных и типов данных в Go. Вы узнаете, как Go делает работу с данными простой, безопасной и эффективной. Мы разберём не только базовые концепции, но и рассмотрим интересные особенности, которые делают Go уникальным языком.

Почему типизация в Go особенная?

Go — это язык со строгой статической типизацией, что означает:

  • Типы проверяются на этапе компиляции
  • Нет неявных преобразований типов
  • Каждая переменная имеет чётко определённый тип
  • Типы помогают писать более надёжный код

💡 Интересный факт: В Go нет классов и наследования, но есть мощная система типов, которая обеспечивает безопасность и производительность.

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

1. Классический способ (var)

var name string = "Иван"
var age int = 25

2. Краткая форма (:=)

name := "Иван"  // Go сам определит тип string
age := 25       // Go сам определит тип int

3. Множественное объявление

var (
    name string = "Иван"
    age  int    = 25
)

// Или краткая форма
name, age := "Иван", 25

Важно: Оператор := можно использовать только внутри функций!

Основные типы данных

1. Числовые типы

Целые числа

var (
    a int   = 42        // Зависит от платформы (32/64 бита)
    b int8  = 127       // -128 до 127
    c int16 = 32767     // -32768 до 32767
    d int32 = 2147483647 // -2147483648 до 2147483647
    e int64 = 9223372036854775807
)

Беззнаковые целые числа

var (
    a uint   = 42
    b uint8  = 255      // 0 до 255
    c uint16 = 65535    // 0 до 65535
    d uint32 = 4294967295
    e uint64 = 18446744073709551615
)

Числа с плавающей точкой

var (
    pi float32 = 3.14159
    e  float64 = 2.718281828459045
)

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

var (
    name string = "Иван"
    char rune   = 'Я'  // Unicode символ
)

🚀 Совет: В Go строки неизменяемы и используют UTF-8 кодировку. Для работы с отдельными символами используйте тип rune.

3. Логические значения

var (
    isActive bool = true
    isAdmin  bool = false
)

Сложные типы данных

1. Массивы

// Фиксированный массив из 5 элементов
var numbers [5]int = [5]int{1, 2, 3, 4, 5}

// Массив можно инициализировать так
primes := [...]int{2, 3, 5, 7, 11, 13}

2. Срезы (динамические массивы)

// Создание среза
numbers := []int{1, 2, 3, 4, 5}

// Добавление элементов
numbers = append(numbers, 6, 7)

// Создание среза из массива
arr := [5]int{1, 2, 3, 4, 5}
slice := arr[1:4] // [2, 3, 4]

3. Карты (ассоциативные массивы)

// Создание карты
ages := map[string]int{
    "Иван": 25,
    "Пётр": 30,
}

// Добавление элемента
ages["Анна"] = 28

// Проверка существования ключа
age, exists := ages["Иван"]
if exists {
    fmt.Printf("Возраст: %d\n", age)
}

4. Структуры

type Person struct {
    Name    string
    Age     int
    Address string
}

// Создание экземпляра структуры
person := Person{
    Name:    "Иван",
    Age:     25,
    Address: "Москва",
}

Константы

const (
    Pi       = 3.14159
    Version  = "1.0.0"
    MaxUsers = 1000
)

💡 Интересный факт: В Go есть специальный тип iota для создания последовательностей констант:

const (
    Monday = iota + 1
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
    Sunday
)

Практические задания

Задание 1: Калькулятор ИМТ

Создайте программу, которая:

  1. Запрашивает рост и вес пользователя
  2. Вычисляет индекс массы тела (ИМТ)
  3. Выводит результат с интерпретацией (недостаточный вес, норма, избыточный вес)

Задание 2: Конвертер валют

Напишите программу, которая:

  1. Хранит курсы валют в константах
  2. Запрашивает сумму и валюту для конвертации
  3. Выводит результат в выбранной валюте

Задание 3: Учёт книг

Создайте программу для учета книг в библиотеке:

  1. Определите структуру Book с полями: название, автор, год издания, жанр
  2. Создайте срез книг
  3. Реализуйте функции для добавления и поиска книг

Что дальше?

В следующем уроке мы:

  • Изучим операторы и выражения
  • Познакомимся с условными операторами
  • Начнём писать более сложные программы
  • Узнаем о приведении типов

🎯 Цель урока: К концу этого урока вы должны уметь:

  • Работать с разными типами данных в Go
  • Использовать различные способы объявления переменных
  • Создавать и использовать сложные типы данных
  • Понимать особенности типизации в Go