Конвертация в golang int to string

Пользователь

Хочу перевести переменную из типа данных int32 в string на Golang. Возможно ли сразу перейти из числа int32 в строку, или нужно сначала сконвертировать int32 в int64???

Дело в том, что в документации функция Itoa работает с с типом данных int, а FormatInt требует переменную int64.

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp Pocket
24 мая 2020 г., 7:03

Пользователь

Не совсем понятно, почему конвертация переменных это проблема. По-моему любая функция конвертации принимает тип данных в зависимости от её входного значения.

24 мая 2020 г., 7:20

Пользователь

Для большинства случаев вы можете использовать функцию из стандартной библиотеки fmt.Sprint(i), но наиболее быстро будет работать самописная функция примерно с таким кодом:

func String(n int32) string {
  buf := [11]byte{}
  pos := len(buf)
  i := int64(n)
  signed := i < 0
  if signed {
    i = -i
  }
  for {
    pos--
    buf[pos], i = '0'+byte(i%10), i/10
    if i == 0 {
      if signed {
        pos--
        buf[pos] = '-'
      }
      return string(buf[pos:])
    }
  }
}
24 мая 2020 г., 7:26

Пользователь

 fmt.Sprint(i) функция будет работать, но сравнительно медленно. К примеру в коде:

func Sprint(a ...interface{}) string {
  p := newPrinter()
  p.doPrint(a)
  s := string(p.buf)
  p.free()
  return s
}

Если нужно получить результат быстрее используйте лучше strconv.Itoa(int(i)) 

func Itoa(i int) string {
  return FormatInt(int64(i), 10)
}


24 мая 2020 г., 8:52

Пользователь

Как еще более быстрый вариант, могу предложить юзать strconv.FormatInt(int64(i), 10). Пример использования в таком вот коде:

func FormatInt(i int64, base int) string {
  _, s := formatBits(nil, uint64(i), base, i < 0, false)
  return s
}
24 мая 2020 г., 9:00

Пользователь

Как вы видите из ответов выше, смену типа данных в зависимости от входной переменной и использования различных функций можно осуществлять по-разному.

В зависимости от того, что вы выберете, может меняться быстродействие кода. 

Довольно показательный пример использование различных функций на 50000000 итераций:

s = String(i)           время исполнения: 5.5923198 сек

s = String2(i)           время исполнения: 5.5923199 сек

s = strconv.FormatInt(int64(i), 10) время исполнения: 5.9133382 сек

s = strconv.Itoa(int(i))      время исполнения: 5.9763418 сек

s = fmt.Sprint(i)          время исполнения: 13.5697761 сек

24 мая 2020 г., 9:18