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?

hardPass
fonte
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.

Klaus Byskov Pedersen
fonte
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

Jasmeet Singh
fonte
%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)
kgthegreat
fonte
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

Bryce
fonte
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.

manigandand
fonte
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"
Cae Vecchi
fonte
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 ""
    }
}
fwhez
fonte
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)
}
Sagiruddin Mondal
fonte