Wie konvertiere ich einen int-Wert in einen String in Go?

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

s ist 'E', aber was ich will ist "123"

Bitte sagen Sie mir, wie ich "123" bekommen kann.

Und in Java kann ich Folgendes tun:

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

Wie kann ich concatzwei Strings in Go?

HardPass
quelle
Die zweite Frage (Verkettung von Zeichenfolgen) hat an anderer Stelle eine Antwort , die die Effizienz abdeckt.
RedGrittyBrick

Antworten:

772

Verwenden Sie die Funktion des strconvPakets Itoa.

Zum Beispiel:

package main

import (
    "strconv"
    "fmt"
)

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

Sie können Zeichenfolgen einfach zusammenfassen, indem Sie sie eingeben +oder die JoinFunktion des stringsPakets verwenden.

Klaus Byskov Pedersen
quelle
97
Warum dachten die Sprachdesigner, dass kryptische Funktionsnamen wie "Itoa" etwas vorzuziehen sind, das etwas aussagekräftiger sein könnte?
Luke
25
@luke stammt aus dem C-Erbe, in dem die gesamte Maschine möglicherweise über 256 KB Speicher verfügt. Die Benutzerfreundlichkeit wurde geopfert, um mehr Funktionalität zu bieten. Die Entwickler von Go sind alle tief in dieses Erbe eingebettet und fühlen sich mit diesen Namen rundum wohl.
Bryan
117
Die Geschichte über die Zugänglichkeit und die Leichtigkeit des Lernens zu stellen, ist schlechtes Design, IMO. :(
Luke
32
@Luke Hängt davon ab, wer Ihre Zielbenutzer sind und wie stark die Konvention ist. Einige Benutzeroberflächen haben noch eine Diskette als Speichersymbol :)
Nathron
65
für leicht zu merken Name ItoA - Integer zu ASCII
Ivan Aracki
139
fmt.Sprintf("%v",value);

Wenn Sie den spezifischen Wertetyp kennen, verwenden Sie beispielsweise den entsprechenden Formatierer %dfürint

Weitere Infos - fmt

Jasmeet Singh
quelle
%dfür int - this
scniro
4
Ich würde dies nicht empfehlen, da dies weitaus weniger effizient ist als andere Konvertierungsmethoden, da es Reflexion verwendet.
Ricardo Souza
49

Es ist interessant festzustellen, dass dies strconv.Itoaeine Abkürzung für ist

func FormatInt(i int64, base int) string

mit Basis 10

Zum Beispiel:

strconv.Itoa(123)

ist äquivalent zu

strconv.FormatInt(int64(123), 10)
kgthegreat
quelle
undefiniert: strconv in strconv.Itoa
Felo Vilches
1
@ FeloVilches importieren "strconv"
kgthegreat
3
Interessant zu bemerken, dass das direkte Aufrufen von FormatInt () anstelle von Itoa () 0,1 Nanosekunden gemäß dem Benchmark unter stackoverflow.com/a/38077508/968244
isapir
43

fmt.Sprintf, strconv.ItoaUnd strconv.FormatIntwird die Arbeit machen. Aber Sprintfdas Paket verwenden reflect, und es wird ein weiteres Objekt zuweisen, so ist es nicht eine effiziente Wahl.

Geben Sie hier die Bildbeschreibung ein

Bryce
quelle
22

In diesem Fall beide strconvund fmt.Sprintfdie gleiche Arbeit , aber die Verwendung von strconvPaket der ItoaFunktion ist die beste Wahl, weil fmt.Sprintfman mehr bei der Konvertierung Objekt zuordnen.

Überprüfen Sie das Nenchmark-Ergebnis von beiden Überprüfen Sie den Benchmark hier: https://gist.github.com/evalphobia/caee1602969a640a4530

Siehe zum Beispiel https://play.golang.org/p/hlaz_rMa0D .

Manigandand
quelle
1
@Boon In sichtbaren Auswirkungen auf Ihre App? Wie immer - es kommt darauf an. Ein anderes Objekt bedeutet, dass ein weiteres Objekt, das über den offensichtlichen vorübergehenden kleinen Speicherschlag hinausgeht, Müll gesammelt werden muss. Wenn Sie die Funktion mit hohen Raten aufrufen, z. B. als Teil eines Serialisierungsprozesses, der verwendet wird, wenn eine Nachricht von irgendwoher empfangen wird, kann dies erhebliche Auswirkungen haben. Da fmt.Sprintfund strconv.iotain Bezug auf die Benutzerfreundlichkeit ähnlich sind und die obigen Daten zeigen, dass iota bei geringerer GC-Auswirkung schneller ist, iotasollte es im Allgemeinen verwendet werden, wenn eine einzelne Ganzzahl konvertiert werden muss.
Edward
Es scheint mir eine vorzeitige Optimierung zu sein, so bald auf dieser Ebene zu denken. Am besten schreiben Sie zuerst lesbaren Code.
Boon
@Boon Sie sind gleichermaßen lesbar. Könnte auch die schnellere verwenden. Was soll ein neuer Golang-Programmierer nicht mit etwas beginnen, das viele dieser Konvertierungen durchführt? Ich bin ein erfahrener Programmierer, der gerade meinen ersten Golang-Code schreibt, und bin in dieser Situation.
Sudo
9

Konvertieren int64:

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

fmt.Println(str)
// Prints "32"
Cae Vecchi
quelle
3

ok, die meisten haben dir etwas Gutes gezeigt. Lassen Sie mich Ihnen Folgendes geben:

// 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
quelle
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
quelle