Прежде чем писать настоящие программы, нужно понять, как 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, но не инициализирована, она получает значение по умолчанию:

ТипЗначение по умолчанию
int0
float640.0
string"" (пустая строка)
boolfalse
pointernil

🧪 Пример

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

🧠 Проверь свои знания

  1. Назови как минимум три вида числовых типов в Go и их отличия.
  2. В чём разница между var и :=?
  3. Что произойдёт, если объявить переменную через var, но не задать ей значение?
  4. Что такое rune и зачем он нужен?
  5. Напиши программу, которая объявляет переменные разных типов и выводит их значения.
  6. Попробуй преобразовать float64 в int и объясни, что происходит с дробной частью.