Как преобразовать значение int в строку в Go?

i := 123
s := string(i) 

s - это "E", но я хочу "123"

Подскажите, пожалуйста, как мне получить "123".

А в Java я могу сделать так:

String s = "ab" + "c"  // s is "abc"

как я могу concat две строки в Go?


person hardPass    schedule 11.04.2012    source источник
comment
На второй вопрос (конкатенация строк) есть ответ в другом месте, касающийся эффективности.   -  person RedGrittyBrick    schedule 07.08.2019
comment
strconv.Itoa(i) (от int до ASCII), чтобы установить int в строку. См. stackoverflow.com/a/62737936/12817546. strconv.Atoi(s) (от ASCII до int), чтобы установить строку в int. См. stackoverflow.com/a/62740786/12817546.   -  person Tom L    schedule 09.07.2020


Ответы (9)


Используйте функцию Itoa пакета strconv.

Например:

package main

import (
    "strconv"
    "fmt"
)

func main() {
    t := strconv.Itoa(123)
    fmt.Println(t)
}

Вы можете объединить строки, просто +' их или используя Join функцию strings упаковка.

person Klaus Byskov Pedersen    schedule 11.04.2012
comment
Если вам нужно выполнить много конкатенаций строк (например, для создания длинной строки) и вы хотите, чтобы ваш код был быстрее и с меньшими выделениями, вам также следует подумать об использовании bytes.Buffer (это своего рода более общая версия Java StringBuilder ). - person Denys Séguret; 11.04.2012
comment
Почему разработчики языка думали, что загадочные имена функций, такие как Itoa, предпочтительнее чего-то более информативного? - person Luke; 17.07.2016
comment
@luke - это наследие C, где вся машина может иметь 256 КБ памяти; Удобство использования было принесено в жертву, чтобы вместить больше функциональности. Все создатели Go глубоко укоренились в этом наследии и чувствуют себя полностью комфортно с этими названиями. - person Bryan; 29.09.2016
comment
Ставить историю выше доступности и простоты обучения - это плохой дизайн, ИМО. :( - person Luke; 29.09.2016
comment
@Luke Зависит от ваших целевых пользователей и от того, насколько сильны соглашения. В некоторых пользовательских интерфейсах дискета по-прежнему отображается в виде значка «Сохранить» :) - person Nathron; 15.11.2016
comment
@ Люк, я ненавижу, что ты так логичен и прав в этом вопросе. Эти намеки на C-подобную загадочность - часть сексуальной привлекательности Го! ???? - person Angad; 15.03.2017
comment
для легкого запоминания имени ItoA - Целое число в ASCII - person Ivan Aracki; 22.02.2018
comment
bytes.Buffer кусает ваши пальцы, если вы продолжите его использовать. Вместо этого используйте strings.Builder. - person Erikas; 21.12.2018
comment
@IvanAracki легко запомнить, потому что это то, что он означает - person JoelFan; 29.01.2019
comment
Go - это изобретение колеса просто для того, чтобы поставить на него бренд Google. - person Chris Pillen; 09.02.2019
comment
@Bryan За исключением того, что они вносят множество случайных изменений, чтобы сделать его не похожим на C, например, помещают тип после имени, когда вы объявляете переменную. - person sudo; 20.02.2019
comment
@sudo прочтите это сообщение в блоге, чтобы узнать, почему шрифт после имени лучше подходит для дизайна. - person Christopher Poile; 13.03.2019
comment
@IvanAracki очень помог. Я цитировал вас в stackoverflow.com/a/62737936/12817546. Я предполагаю, что Atoi - это ASCII для целого числа. - person Tom L; 07.07.2020
comment
Itoa делает только return FormatInt(int64(i), 10). ИМО, функция FormatInt не является ни загадочным, ни плохим дизайном. И мне очень нравится, как здесь ярлык, т.е. Itoa - это дань тому же методу в C. - person kapad; 21.08.2020
comment
Мне нравится, что этот раздел комментариев решил, что это место, где можно определить ценность корней и дизайнерских решений Go. - person Kyle; 16.09.2020

fmt.Sprintf("%v",value);

Если вам известен конкретный тип значения, используйте соответствующее средство форматирования, например %d для int

Дополнительная информация - fmt

person Jasmeet Singh    schedule 25.03.2014
comment
%d для int - это - person scniro; 04.06.2018
comment
Я бы не рекомендовал это, так как он намного менее эффективен, чем другие методы преобразования, потому что он использует отражение. - person Ricardo Souza; 10.07.2019
comment
Потрясающий комментарий @RicardoSouza. Я процитировал вас здесь stackoverflow.com/a/62725637/12817546. - person Tom L; 07.07.2020

Интересно отметить, что strconv.Itoa - это сокращение для

func FormatInt(i int64, base int) string

с основанием 10

Например:

strconv.Itoa(123)

эквивалентно

strconv.FormatInt(int64(123), 10)
person kgthegreat    schedule 17.01.2015
comment
Интересно отметить, что вызов FormatInt () напрямую вместо Itoa () экономит 0,1 наносекунды в соответствии с тестом на stackoverflow.com/a/38077508/ 968244 - person isapir; 18.11.2018

fmt.Sprintf, strconv.Itoa и strconv.FormatInt сделают свою работу. Но Sprintf будет использовать пакет reflect и выделит еще один объект, так что это неэффективный выбор.

введите описание изображения здесь

person Bryce    schedule 31.05.2016

Вы можете использовать fmt.Sprintf или strconv.FormatFloat

Например

package main

import (
    "fmt"
)

func main() {
    val := 14.7
    s := fmt.Sprintf("%f", val)
    fmt.Println(s)
}
person lazy1    schedule 11.04.2012

В этом случае и strconv, и fmt.Sprintf выполняют одну и ту же работу, но использование функции Itoa пакета strconv - лучший выбор, потому что fmt.Sprintf выделяет еще один объект во время преобразования.

проверьте результат nenchmark  of both проверьте эталон здесь: https://gist.github.com/evalphobia/caee1602969a640a4530

см., например, https://play.golang.org/p/hlaz_rMa0D.

person manigandand    schedule 28.06.2016
comment
@Boon Видно ли влияние на ваше приложение? Как всегда - смотря как. Другой объект означает, что еще один объект, помимо очевидного временного небольшого попадания в память, нуждается в сборке мусора. Если вы вызываете функцию с высокой частотой, например, как часть некоторого процесса сериализации, используемого всякий раз, когда откуда-то получено сообщение, это может иметь значительное влияние. Поскольку fmt.Sprintf и strconv.iota схожи с точки зрения простоты использования, а приведенные выше данные показывают, что йота работает быстрее с меньшим влиянием на сборщик мусора, похоже, что iota следует использовать в целом, когда нужно преобразовать одно целое число. - person Edward; 14.11.2018
comment
Мне кажется, что так скоро я буду думать на этом уровне преждевременно. Лучше всего сначала написать читаемый код. - person Boon; 16.11.2018
comment
@Boon Они одинаково читабельны. Можно также использовать более быстрый. Кроме того, что сказать, новый программист Golang не начинает с чего-то, что делает много таких преобразований? Я опытный программист, пишущий свой первый код на Golang прямо сейчас, и нахожусь в такой ситуации. - person sudo; 20.02.2019

Преобразование int64:

n := int64(32)
str := strconv.FormatInt(n, 10)

fmt.Println(str)
// Prints "32"
person Cae Vecchi    schedule 03.10.2018

хорошо, большинство из них показали вам что-то хорошее. Я дам вам это:

// ToString Change arg to string
func ToString(arg interface{}, timeFormat ...string) string {
    if len(timeFormat) > 1 {
        log.SetFlags(log.Llongfile | log.LstdFlags)
        log.Println(errors.New(fmt.Sprintf("timeFormat's length should be one")))
    }
    var tmp = reflect.Indirect(reflect.ValueOf(arg)).Interface()
    switch v := tmp.(type) {
    case int:
        return strconv.Itoa(v)
    case int8:
        return strconv.FormatInt(int64(v), 10)
    case int16:
        return strconv.FormatInt(int64(v), 10)
    case int32:
        return strconv.FormatInt(int64(v), 10)
    case int64:
        return strconv.FormatInt(v, 10)
    case string:
        return v
    case float32:
        return strconv.FormatFloat(float64(v), 'f', -1, 32)
    case float64:
        return strconv.FormatFloat(v, 'f', -1, 64)
    case time.Time:
        if len(timeFormat) == 1 {
            return v.Format(timeFormat[0])
        }
        return v.Format("2006-01-02 15:04:05")
    case jsoncrack.Time:
        if len(timeFormat) == 1 {
            return v.Time().Format(timeFormat[0])
        }
        return v.Time().Format("2006-01-02 15:04:05")
    case fmt.Stringer:
        return v.String()
    case reflect.Value:
        return ToString(v.Interface(), timeFormat...)
    default:
        return ""
    }
}
person fwhez    schedule 28.02.2019
comment
Отлично! Вы можете включить uint + uint8-64, чтобы получить полный список - person evilReiko; 17.06.2021
comment
Также форматировать логическое - person evilReiko; 17.06.2021

Другой вариант:

package main
import "fmt"

func main() {
   n := 123
   s := fmt.Sprint(n)
   fmt.Println(s == "123")
}

https://golang.org/pkg/fmt#Sprint

person Steven Penny    schedule 23.05.2021