Как int превратить в string в Go: полное руководство с примерами

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

«Я ломал голову час, а решение в три строки»: как int превратить в string в Go

Представьте: вы пишете на Go микросервис, обрабатываете числовые ID пользователей и внезапно понимаете, что их нужно склеить с текстом в логах или HTTP-ответе. Вы пишете что-то вроде str := "User_" + id — и компилятор выдаёт ошибку: cannot use id (type int) as type string in concatenation. Знакомо?

Это один из самых популярных вопросов на Stack Overflow по Go — «How to convert an int value to string in Go?» — его просмотрели сотни тысяч раз. И не зря: в Go строгая типизация, и просто «сложить» число со строкой не получится. Но не переживайте — сегодня мы разберём все способы конвертации int в string в Go. Вы узнаете, какой метод быстрее, какой безопаснее, и когда что использовать. Поехали!

Почему Go не разрешает просто сложить int и string?

В отличие от JavaScript или Python, где "Age: " + 25 работает «из коробки», Go требует явного преобразования типов. Это сделано для безопасности: вы всегда должны контролировать, что и во что превращается. Представьте, что вы случайно складываете число с текстом — в других языках это может привести к трудноуловимым багам. В Go компилятор сразу скажет: «Стоп, так нельзя».

Поэтому для конвертации int в string в Go существуют специальные функции из стандартной библиотеки. Никаких внешних зависимостей — только чистый Go.

Способ №1: fmt.Sprintf — универсальный «швейцарский нож»

Самый интуитивный способ — использовать функцию fmt.Sprintf. Вы наверняка уже знакомы с ней по форматированному выводу. Она умеет превращать что угодно в строку — числа, булевы значения, структуры.

package main

import "fmt"

func main() {
    age := 25
    str := fmt.Sprintf("Age: %d", age)
    fmt.Println(str) // Вывод: Age: 25
}

Плюсы:

  • Очень гибкий: можно сразу встраивать число в строку с нужным форматом (десятичный, шестнадцатеричный, с ведущими нулями).
  • Подходит для любых типов — не только int, но и float, bool, struct.

Минусы:

  • Использует рефлексию под капотом, поэтому работает медленнее специализированных функций.
  • Если вам нужно просто получить строку из числа (без форматирования), это избыточно.

Когда использовать: когда нужно не просто конвертировать, но и отформатировать вывод — добавить символы валюты, выровнять по ширине, перевести в HEX.

Способ №2: strconv.Itoa — быстрый и простой (int → string)

Если ваша задача — просто получить строковое представление числа, без всяких «украшательств», используйте strconv.Itoa. Это специализированная функция для конвертации int в string. Она работает быстро и не делает лишних операций.

package main

import (
    "fmt"
    "strconv"
)

func main() {
    number := 42
    str := strconv.Itoa(number)
    fmt.Println(str) // Вывод: "42"
    fmt.Printf("Тип: %T\n", str) // Тип: string
}

Плюсы:

  • Максимальная производительность для базового случая.
  • Простота: одна функция — одно действие.

Минусы:

  • Работает только с типом int. Если у вас int64, int32 и т.д., нужно сначала привести к int или использовать другой метод.
  • Нет контроля над системой счисления — только десятичное представление.

Когда использовать: когда у вас обычный int и нужно просто получить строку — это ваш выбор по умолчанию.

Способ №3: strconv.FormatInt — контроль над системой счисления

А что, если вам нужно преобразовать число не в десятичную строку, а, скажем, в двоичную, восьмеричную или шестнадцатеричную? Тут на помощь приходит strconv.FormatInt. Она принимает два аргумента: само число (типа int64) и основание системы счисления (от 2 до 36).

package main

import (
    "fmt"
    "strconv"
)

func main() {
    var num int64 = 255

    binary := strconv.FormatInt(num, 2)  // Двоичная
    octal := strconv.FormatInt(num, 8)   // Восьмеричная
    hex := strconv.FormatInt(num, 16)    // Шестнадцатеричная

    fmt.Println("Двоичная:", binary)   // 11111111
    fmt.Println("Восьмеричная:", octal) // 377
    fmt.Println("Шестнадцатеричная:", hex) // ff
}

Плюсы:

  • Полный контроль над системой счисления.
  • Работает с любыми целыми типами (через приведение к int64).

Минусы:

  • Требует явного приведения типа, если у вас не int64.
  • Немного более громоздкий синтаксис.

Когда использовать: когда нужно получить строку в нестандартной системе счисления (HEX, binary) или когда у вас тип int64/uint64.

Способ №4: strconv.FormatUint — для беззнаковых целых

Если вы работаете с uint (беззнаковыми целыми), используйте strconv.FormatUint. Работает аналогично FormatInt, но принимает uint64.

package main

import (
    "fmt"
    "strconv"
)

func main() {
    var num uint64 = 1024
    str := strconv.FormatUint(num, 10)
    fmt.Println(str) // "1024"
}

Способ №5: Ручная конвертация (для любознательных)

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

package main

import "fmt"

func intToString(n int) string {
    if n == 0 {
        return "0"
    }
    result := ""
    for n > 0 {
        digit := n % 10
        result = string('0'+rune(digit)) + result
        n /= 10
    }
    return result
}

func main() {
    fmt.Println(intToString(12345)) // "12345"
}

Функция посимвольно «выкусывает» последнюю цифру

Блоги

Рекомендаций по книгам