Come convertire un valore int in stringa in Go?


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

s è 'E', ma quello che voglio è "123"

Ti prego, dimmi come posso ottenere "123".

E in Java, posso fare in questo modo:

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

come posso concatdue stringhe in Go?


La seconda domanda (concatenazione di stringhe) ha una risposta altrove che copre l'efficienza.
RedGrittyBrick

Risposte:


772

Usa la funzione strconvdel pacchetto Itoa.

Per esempio:

package main

import (
    "strconv"
    "fmt"
)

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

Puoi concatenare le stringhe semplicemente +inserendole o usando la Joinfunzione del stringspacchetto.


97
Perché i progettisti del linguaggio hanno pensato che nomi di funzioni criptiche come "Itoa" fossero preferibili a qualcosa che potrebbe essere un po 'più descrittivo?
Luca,

25
@luke proviene dall'eredità C in cui l'intera macchina potrebbe avere 256K di memoria; l'usabilità è stata sacrificata per adattarsi a più funzionalità. I ​​creatori di Go sono profondamente radicati in quell'eredità e si sentono completamente a proprio agio con questi nomi.
Bryan,

117
Mettere la storia al di sopra dell'accessibilità e della facilità di apprendimento è una cattiva progettazione dell'IMO. :(
Luca,

32
@Luke Dipende da chi sono i tuoi utenti target e da quanto è forte la convenzione. Alcune UI hanno ancora un dischetto come icona Salva :)
Nathron

65
per ricordare facilmente il nome ItoA - Numero intero in ASCII
Ivan Aracki,

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

Se si conosce il tipo specifico di valore utilizzare il formattatore corrispondente, ad esempio %dperint

Maggiori informazioni - fmt


%dper int - this
scniro,

4
Non lo consiglierei, poiché è molto meno efficiente di altri metodi di conversione perché utilizza la riflessione.
Ricardo Souza,

49

È interessante notare che strconv.Itoaè una scorciatoia per

func FormatInt(i int64, base int) string

con base 10

Per esempio:

strconv.Itoa(123)

è equivalente a

strconv.FormatInt(int64(123), 10)

indefinito: strconv in strconv.Itoa
Felo Vilches

1
@FeloVilches import "strconv"
kgthegreat

3
Interessante notare che la chiamata FormatInt () direttamente invece di itoa () consente di risparmiare 0,1 nanosecondo secondo il punto di riferimento a stackoverflow.com/a/38077508/968244
isapir

43

fmt.Sprintf, strconv.ItoaE strconv.FormatIntfarà il lavoro. Ma Sprintfutilizzerà il pacchetto reflecte assegnerà un altro oggetto, quindi non è una scelta efficiente.

inserisci qui la descrizione dell'immagine



22

In questo caso entrambi strconve fmt.Sprintffanno lo stesso lavoro ma usare la funzione strconvdel pacchetto Itoaè la scelta migliore, perché fmt.Sprintfallocare un altro oggetto durante la conversione.

controlla il risultato di entrambi i punti controlla qui il benchmark: https://gist.github.com/evalphobia/caee1602969a640a4530

vedi ad esempio https://play.golang.org/p/hlaz_rMa0D .


1
@Boon In impatto visibile sulla tua app? Come sempre - dipende. Un altro oggetto significa che un altro oggetto, oltre all'ovvio colpo temporaneo di memoria piccola, deve essere raccolto. Se si chiama la funzione a tariffe elevate, ad esempio come parte di un processo di serializzazione utilizzato ogni volta che un messaggio viene ricevuto da qualche parte, potrebbe avere un impatto significativo. Poiché fmt.Sprintfe strconv.iotasono simili in termini di facilità d'uso e i dati sopra riportati mostrano che iota è più veloce con un impatto GC inferiore, sembra che iotadovrebbe essere usato in generale quando un singolo numero intero deve essere convertito.
Edward

Mi sembra un'ottimizzazione prematura per me pensare a questo livello così presto. La cosa migliore è scrivere prima un codice leggibile.
Boon,

@Boon Sono ugualmente leggibili. Potrebbe anche usare quello più veloce. Inoltre, cosa c'è da dire che un nuovo programmatore Golang non sta iniziando con qualcosa che fa molte di queste conversioni? Sono un programmatore esperto che scrive il mio primo codice Golang in questo momento e sono in quella situazione.
sudo,

9

Conversione int64:

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

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

3

ok, molti di loro ti hanno mostrato qualcosa di buono. Lascia che ti dia questo:

// 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)
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.