Como converter um valor int para string no Go?


486
i := 123
s := string(i) 

s é 'E', mas o que eu quero é "123"

Por favor, diga-me como posso obter "123".

E em Java, eu posso fazer desta maneira:

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

como posso concatduas strings no Go?


A segunda pergunta (concatenação de strings) tem uma resposta em outro lugar que cobre a eficiência.
RedGrittyBrick

Respostas:


772

Use a função strconvdo pacote Itoa.

Por exemplo:

package main

import (
    "strconv"
    "fmt"
)

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

Você pode concaturar strings simplesmente usando +-as ou usando a Joinfunção do stringspacote.


97
Por que os designers de linguagem pensaram que nomes de funções enigmáticas como "Itoa" eram preferíveis a algo que poderia ser um pouco mais descritivo?
Lucas

25
@luke vem da herança C, onde a máquina inteira pode ter 256K de memória; a usabilidade foi sacrificada para encaixar mais funcionalidade. Os criadores do Go estão profundamente enraizados nessa herança e se sentem totalmente à vontade com esses nomes.
Bryan

117
Colocar o histórico acima da acessibilidade e da facilidade de aprendizado é um projeto ruim da IMO. :(
Luke

32
@ Luke Depende de quem são seus usuários-alvo e de quão forte é a convenção. Alguns UIs ainda tem um disquete como o ícone Salvar :)
Nathron

65
para facilitar o nome lembrando itoa - Integer para ASCII
Ivan Aracki

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

Se você conhece o tipo específico de valor, use o formatador correspondente, por exemplo, %dparaint

Mais informações - fmt


%dpara int - this
scniro 4/18

4
Eu não recomendaria isso, pois isso é muito menos eficiente do que outros métodos de conversão porque usa reflexão.
Ricardo Souza

49

É interessante notar que strconv.Itoaé uma abreviação de

func FormatInt(i int64, base int) string

com base 10

Por exemplo:

strconv.Itoa(123)

é equivalente a

strconv.FormatInt(int64(123), 10)

indefinida: StrConv em strconv.Itoa
Felo Vilches

1
@FeloVilches import "strconv"
kgthegreat 14/08

3
Interessante notar que chamar FormatInt () diretamente em vez de itoa () salva 0,1 nanossegundo de acordo com o ponto de referência na stackoverflow.com/a/38077508/968244
isapir

43

fmt.Sprintf, strconv.ItoaE strconv.FormatIntvai fazer o trabalho. Mas Sprintfusará o pacote reflecte alocará mais um objeto, portanto, não é uma escolha eficiente.

insira a descrição da imagem aqui



22

Neste caso, tanto strconve fmt.Sprintffazer o mesmo trabalho, mas usando o strconvdo pacote Itoafunção é a melhor escolha, porque fmt.Sprintfalocar mais um objeto durante a conversão.

verifique o resultado de nenchmark de ambos verifique o benchmark aqui: https://gist.github.com/evalphobia/caee1602969a640a4530

veja https://play.golang.org/p/hlaz_rMa0D, por exemplo.


1
@Boon Em impacto visível para o seu aplicativo? Como sempre - depende. Outro objeto significa que mais um objeto, além da óbvia ocorrência temporária de memória pequena, precisa ser coletado como lixo. Se você estiver chamando a função a taxas altas, por exemplo, como parte de algum processo de serialização usado sempre que uma mensagem for recebida de algum lugar, isso poderá ter um impacto significativo. Desde fmt.Sprintfe strconv.iotasão semelhantes em termos de facilidade de utilização e os dados mostram acima jota para ser mais rápido com menor impacto GC, verifica-se que iotadevem ser usados, em geral, quando um único número inteiro necessidades de conversão.
Edward

Parece otimização prematura para mim estar pensando nesse nível tão cedo. O melhor é escrever o código legível primeiro.
Boon

@ Boon Eles são igualmente legíveis. É melhor usar o mais rápido. Além disso, o que dizer um novo programador de Golang não está começando com algo que faz muitas dessas conversões? Sou um programador experiente escrevendo meu primeiro código Golang agora e estou nessa situação.
sudo

9

Convertendo int64:

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

fmt.Println(str)
// Prints "32"

3

ok, a maioria deles mostrou algo de bom. Vamos lhe dar o seguinte:

// 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 ""
    }
}

0
package main

import (
    "fmt" 
    "strconv"
)

func main(){
//First question: how to get int string?

    intValue := 123
    // keeping it in separate variable : 
    strValue := strconv.Itoa(intValue) 
    fmt.Println(strValue)

//Second question: how to concat two strings?

    firstStr := "ab"
    secondStr := "c"
    s := firstStr + secondStr
    fmt.Println(s)
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.