788 Stimmen

Wie konvertiert man einen int-Wert in einen String in Go?

i := 123
s := strconv.Itoa(i) 

s ist 'E', aber ich möchte "123"

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

Und in Java kann ich es auf diese Weise tun:

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

wie kann ich in Go zwei Zeichenfolgen zusammenfügen?

0 Stimmen

Die zweite Frage (Zeichenkettenverknüpfung) hat eine Antwort anderswo, die Effizienz behandelt.

0 Stimmen

strconv.Itoa(i) (int to ASCII), um eine Ganzzahl in einen String zu setzen. Siehe stackoverflow.com/a/62737936/12817546. strconv.Atoi(s) (ASCII zu int), um einen String in eine Ganzzahl umzuwandeln. Siehe stackoverflow.com/a/62740786/12817546.

34voto

manigandand Punkte 2034

In diesem Fall erledigen sowohl strconv als auch fmt.Sprintf die gleiche Arbeit, aber die Verwendung der Funktion Itoa des Pakets strconv ist die beste Wahl, weil fmt.Sprintf bei der Konvertierung ein weiteres Objekt alloziiert.

Überprüfen Sie das Benchmark-Ergebnis beider überprüfen Sie das Benchmark hier: https://gist.github.com/evalphobia/caee1602969a640a4530

sehen Sie sich das Beispiel unter https://play.golang.org/p/hlaz_rMa0D an.

1 Stimmen

@Boon In sichtbarer Auswirkung auf Ihre App? Wie immer - es hängt davon ab. Ein weiteres Objekt bedeutet ein weiteres Objekt, das über den offensichtlichen vorübergehenden kleinen Speicherplatzbedarf hinaus gesammelt werden muss. Wenn Sie die Funktion häufig aufrufen, beispielsweise als Teil eines Serialisierungsprozesses, der jedes Mal verwendet wird, wenn eine Nachricht von irgendwo empfangen wird, könnte dies eine signifikante Auswirkung haben. Da fmt.Sprintf und strconv.iota in Bezug auf die Benutzerfreundlichkeit ähnlich sind und die obigen Daten zeigen, dass iota schneller ist und weniger Auswirkungen auf die Garbage Collection hat, scheint es, dass iota im Allgemeinen verwendet werden sollte, wenn eine einzelne Zahl konvertiert werden muss.

1 Stimmen

Es scheint mir wie verfrühte Optimierung zu sein, schon so früh auf dieser Ebene zu denken. Am besten ist es, zunächst lesbaren Code zu schreiben.

0 Stimmen

@Boon Sie sind gleichermaßen lesbar. Könnte genauso gut den schnelleren benutzen. Außerdem, wer sagt denn, dass ein neuer Golang-Programmierer nicht mit etwas beginnt, das viele dieser Konvertierungen durchführt? Ich bin ein erfahrener Programmierer, der gerade seinen ersten Golang-Code schreibt und sich in dieser Situation befindet.

16voto

Zombo Punkte 1

Eine andere Option:

package main
import "fmt"

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

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

0 Stimmen

Vielen Dank. Dies ist eine praktische und leicht zu merkende Lösung (aus meiner Sicht).

14voto

Cae Vecchi Punkte 728

Umwandlung von int64:

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

fmt.Println(str)
// Gibt "32" aus

8voto

fwhez Punkte 543

Okay, die meisten von ihnen haben dir etwas Gutes gezeigt. Lass mich dir etwas geben:

// ToString Ändere arg in einen String
func ToString(arg interface{}, timeFormat ...string) string {
    if len(timeFormat) > 1 {
        log.SetFlags(log.Llongfile | log.LstdFlags)
        log.Println(errors.New(fmt.Sprintf("Die Länge von timeFormat sollte eins sein")))
    }
    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 Stimmen

Das ist großartig! Du kannst uint+uint8-64 hinzufügen, um eine vollständige Liste zu erhalten

0 Stimmen

Oder Sie könnten einfach fmt.Sprint verwenden, das dasselbe macht (außer für time.Time und jsoncrack.Time (ein Paket, das Abhängigkeiten hinzufügt, von denen ich noch nie gehört habe) Werte).

4voto

Sagiruddin Mondal Punkte 4979
package main

import (
    "fmt" 
    "strconv"
)

func main(){
//Erste Frage: Wie bekomme ich eine int-Zeichenfolge?

    intValue := 123
    // In separater Variable aufbewahren: 
    strValue := strconv.Itoa(intValue) 
    fmt.Println(strValue)

//Zweite Frage: Wie füge ich zwei Zeichenfolgen zusammen?

    firstStr := "ab"
    secondStr := "c"
    s := firstStr + secondStr
    fmt.Println(s)
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X