Avatar ·

Как преобразовать int в string в Go? Ищу рабочий способ

Всем привет! Я только начал изучать Go и столкнулся с базовой, но непонятной для меня задачей. Мне нужно преобразовать целое число (int) в строку (string), чтобы потом склеить её с другой строкой или вывести на экран. В других языках (например, в Python или Java) это делается очень просто: `str(42)` или `String.valueOf(42)`. Но в Go я попробовал сделать так: ```go num := 42 text := "Значение: " + num fmt.Println(text) ``` И получил ошибку компиляции: `cannot use num (type int) as type string in concatenation`. Я понял, что в Go нельзя просто сложить строку и число. Потом я попробовал использовать `string(num)` — думал, что это сработает, как в Python: ```go num := 42 text := "Значение: " + string(num) fmt.Println(text) ``` Но в консоли вывелось что-то странное: `Значение: *` (звёздочка или другой символ). Оказалось, `string(num)` преобразует число не в его текстовое представление, а в символ Unicode с кодом 42 (это символ '*'). Это вообще не то, что мне нужно. Подскажите, как правильно преобразовать 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.