«Я ломал голову час, а решение в три строки»: как 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"
}
Функция посимвольно «выкусывает» последнюю цифру