логотип PurpleSchool
логотип PurpleSchool

Преобразование типов в Golang

Автор

Александр Гольцман

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

Зачем нужно преобразование типов?

При работе с данными в Go часто возникает необходимость привести один тип к другому. Например, у вас может быть число в виде строки, которое нужно преобразовать в int, или целое число, которое требуется представить в float64 для точных вычислений.

Преобразование типов в Go решает несколько задач:

  • Корректная работа с разными типами данных — например, арифметические операции должны выполняться между числами одного типа.
  • Чтение и запись данных — текстовые форматы (JSON, CSV) хранят числа как строки, и их нужно преобразовывать в числовые типы.
  • Совместимость API — иногда библиотеки и функции требуют данные определенного типа.

Go требует явного преобразования между несоответствующими типами, чтобы избежать скрытых ошибок.

Преобразование числовых типов

В Go можно преобразовывать числовые типы друг в друга с помощью синтаксиса:

var x int = 42
var y float64 = float64(x) // Преобразование int в float64
var z uint = uint(x)       // Преобразование int в uint

Смотрите, здесь нет автоматического преобразования, как в других языках. Например, сложение int и float64 вызовет ошибку:

var a int = 10
var b float64 = 5.5
// fmt.Println(a + b) // Ошибка: mismatched types int and float64

Чтобы код работал, нужно привести a к float64:

fmt.Println(float64(a) + b) // Выведет 15.5

Преобразование строк и чисел

Иногда данные приходят в виде строк, и их нужно преобразовать в числа. Для этого в пакете strconv есть функции:

  • strconv.Atoi(s string) (int, error) — преобразует строку в int.
  • strconv.ParseFloat(s string, bitSize int) (float64, error) — преобразует строку в float64.
  • strconv.Itoa(i int) string — преобразует int в строку.

Пример:

import (
    "fmt"
    "strconv"
)

func main() {
    s := "123"
    n, err := strconv.Atoi(s)
    if err != nil {
        fmt.Println("Ошибка:", err)
        return
    }
    fmt.Println(n + 10) // Выведет 133

    f := 3.14
    str := strconv.FormatFloat(f, 'f', 2, 64)
    fmt.Println(str) // "3.14"
}

Здесь strconv.Atoi преобразует строку "123" в число, а strconv.FormatFloat превращает число 3.14 обратно в строку с двумя знаками после запятой.

Преобразование interface{} и type assertion

Go поддерживает пустой интерфейс interface{}, который может хранить значения любого типа. Чтобы извлечь конкретный тип из interface{}, используется type assertion:

var i interface{} = "Hello"
s, ok := i.(string)
if ok {
    fmt.Println(s) // "Hello"
} else {
    fmt.Println("Преобразование не удалось")
}

Если тип не соответствует, без ok программа вызовет панику.

Преобразование struct и map в JSON

При работе с API и файлами часто нужно преобразовывать структуры в JSON и обратно. В Go для этого есть пакет encoding/json:

import (
    "encoding/json"
    "fmt"
)

type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    user := User{Name: "Alice", Age: 25}
    data, _ := json.Marshal(user)
    fmt.Println(string(data)) // {"name":"Alice","age":25}

    var newUser User
    json.Unmarshal(data, &newUser)
    fmt.Println(newUser.Name) // "Alice"
}

Здесь json.Marshal превращает структуру в JSON-строку, а json.Unmarshal преобразует её обратно в struct.

Заключение

Преобразование типов в Go требует явного указания и подчиняется строгим правилам. Это делает код более предсказуемым и безопасным, исключая неожиданные приведения, как в динамически типизированных языках.

Здесь я показал ключевые техники: работу с числами, строками, interface{} и JSON. Важно помнить, что преобразование не всегда возможно, поэтому стоит обрабатывать ошибки, особенно при работе со строками и interface{}.

Используйте встроенные инструменты Go, такие как strconv, json и type assertion, и ваш код будет безопасным и понятным.

Стрелочка влевоРабота с YAML в GolangКонвертация структур в JSON в GolangСтрелочка вправо

Постройте личный план изучения Golang до уровня Middle — бесплатно!

Golang — часть карты развития Backend

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по Golang

Работа с YAML в GolangПреобразование типов в GolangКонвертация структур в JSON в GolangStrconv в GolangИспользование пакета SQLx для работы с базами данных в GolangРазбираемся с SQL в GolangРазделение строк с помощью функции split в GolangSort в GoПоиск и замена строк в Go - GolangИспользование пакета reflect в GolangРабота с PostgreSQL в GoPointers в GolangПарсинг в GoРабота со списками (list) в GolangПреобразование int в string в GolangРабота с числами с плавающей точкой в GolangРабота с полями в GolangИспользование enum в GolangОбработка JSON в GoЧтение и запись CSV-файлов в GolangРабота с cookie в GolangРегистры в GoКэширование данных в GolangПреобразование byte в string в GolangByte в GoИспользование bufio для работы с потоками данных в GolangДобавление данных и элементов (add) в Go
Логирование в Golang. Zap, Logrus, Loki, GrafanaРабота с Docker-контейнерами в GoИспользование pprof в GolangМеханизмы синхронизации в GolangРабота с пакетом S3 в GolangМониторинг Golang приложений с помощью PrometheusОптимизация проектов на GoПаттерны проектирования в GolangТрейсинг запросов с OpenTelemetry в GoМиграции базы данных в GolangНастройка шины событий NATS NSQ в GoНастройка уровней логирования log levels в GoGo Playground и компилятор GolangОркестрация контейнеров Go с Kubernetes + DockerGjИспользование go mod init для создания модулей GolangРабота с переменными окружения (env) в GolangКоманда go build в GolangАвтоматизация Golang проектов — CI/CD с GitLab CI и JenkinsРуководство по embed в GoОтладка кода в GolangЧтение и использование конфигурации в приложениях на GolangКомпиляция в GolangКак развернуть Go-приложение на облаке AWSАутентификация в Golang
Сетевые протоколы в GoПеременные в GolangЗначения в GolangДженерик %T и его применение в GolangТипы данных в GolangИспользование tls в GolangИспользование tag в структурах GolangSwitch в GoСтроки в GolangРабота с потоками (stream) в GolangSelect в GoРуны в GoРабота с пакетом params в GolangКонвертация строк в числа в GolangNull, Nil, None, 0 в GoНаименования переменных, функций и структур в GoInt в GolangУстановка GolangЧтение и установка HTTP заголовков в GolangMethods в GolangGoLand — IDE для разработки на Golang от JetBrainsОбработка «not found» в GolangFloat в GolangФлаги командной строки в Go (Golang)Запуск внешних команд в GolangОбработка ошибок в GoИспользование defer в GolangЗначения default в GolangГенерация кода в GoФорматирование кода в GolangЧистая архитектура в GolangКаналы (channels) в GolangПолучение body из HTTP запроса в Golang
Открыть базу знаний

Лучшие курсы по теме

изображение курса

Основы Golang

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Nest.js с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.6
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Docker и Ansible

Антон Ларичев
AI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее