Как преобразовать int в string в Go? Ищу рабочий способ
Использование пакета strconv
В Go для преобразования целого числа в строку используется функция Itoa (Integer to ASCII) из стандартного пакета strconv. Это самый простой и правильный способ.
Вот как должен выглядеть ваш код:
package main
import (
"fmt"
"strconv"
)
func main() {
num := 42
text := "Значение: " + strconv.Itoa(num)
fmt.Println(text) // Выведет: Значение: 42
}
Функция strconv.Itoa(num) принимает целое число (int) и возвращает его строковое представление. Она работает для любого целого числа, включая отрицательные:
num := -123
str := strconv.Itoa(num)
fmt.Println(str) // "-123"
Универсальный вариант: strconv.FormatInt
Если вам нужно работать с числами других типов (например, int64, int32), используйте более общую функцию FormatInt. Она принимает значение типа int64 и основание системы счисления (обычно 10):
var num int64 = 9876543210
str := strconv.FormatInt(num, 10)
fmt.Println(str) // "9876543210"
Для int32 или других целочисленных типов просто приведите их к int64:
var small int32 = 255
str := strconv.FormatInt(int64(small), 10)
fmt.Println(str) // "255"
Почему не работает string(num)?
В Go встроенная функция string() при работе с целыми числами интерпретирует их как коды символов Unicode (руны). То есть string(42) — это не текст "42", а символ с кодом 42, то есть звёздочка '*'. Это особенность языка, которая часто сбивает с толку новичков.
Альтернатива: fmt.Sprintf
Можно также использовать функцию fmt.Sprintf, которая работает как форматирование строк в C или Python. Это удобно, когда нужно вставить число в середину строки:
num := 42
text := fmt.Sprintf("Значение: %d", num)
fmt.Println(text) // "Значение: 42"
Однако fmt.Sprintf работает медленнее, чем strconv.Itoa, потому что использует рефлексию. Для простых преобразований всегда предпочитайте strconv.Itoa.
Резюме
- Для int → string:
strconv.Itoa(num) - Для int64 → string:
strconv.FormatInt(num, 10) - Для вставки в строку:
fmt.Sprintf("%d", num) - Не используйте:
string(num)— это преобразует число в символ Unicode
Пакет strconv — ваш лучший друг при работе с преобразованиями строк и чисел в Go. Он быстрый, простой и полностью соответствует идиомам языка.
Использование fmt.Sprint для универсального преобразования
Если вы не хотите запоминать названия функций из пакета strconv, можно воспользоваться функцией fmt.Sprint. Она принимает любое значение и возвращает его строковое представление:
package main
import "fmt"
func main() {
num := 42
text := "Значение: " + fmt.Sprint(num)
fmt.Println(text) // "Значение: 42"
}
Преимущество fmt.Sprint в том, что он работает с любыми типами: int, float64, bool, срезы и т.д. Это удобно для быстрого прототипирования или когда тип числа заранее неизвестен.
Однако стоит помнить, что fmt.Sprint медленнее strconv.Itoa, потому что внутри использует рефлексию для определения типа. Для высоконагруженного кода или частых преобразований лучше использовать strconv.
Также есть вариант с fmt.Sprintln, который добавляет пробел и перевод строки, но для простой конкатенации он не подходит.
Совет: для production-кода используйте strconv.Itoa, а для быстрых скриптов или тестов — fmt.Sprint.