Konvertieren von Datentypen in Go

Einführung

In Go werden Datentypen verwendet, um einen bestimmten Datentyp zu klassifizieren und die Werte zu bestimmen, die Sie dem Typ zuweisen können, sowie die Vorgänge, die Sie für ihn ausführen können. Beim Programmieren müssen Sie manchmal Werte zwischen Typen konvertieren, um die Werte auf andere Weise zu bearbeiten. Beispielsweise müssen Sie möglicherweise numerische Werte mit Zeichenfolgen verketten oder Dezimalstellen in Zahlen darstellen, die als Ganzzahlwerte initialisiert wurden. Benutzergenerierte Daten erhalten häufig automatisch den Datentyp "Zeichenfolge", auch wenn sie aus Zahlen bestehen. Um in dieser Eingabe mathematische Operationen auszuführen, müssten Sie die Zeichenfolge in einen numerischen Datentyp konvertieren.

Da Go eine statisch typisierte Sprache ist, sinddata types are bound to variables und keine Werte. Dies bedeutet, dass wenn Sie eine Variable alsint definieren, sie nurint sein kann. Sie können ihm keinstring zuweisen, ohne den Datentyp der Variablen zu konvertieren. Die statische Natur von Datentypen in Go legt noch mehr Wert auf das Erlernen der Konvertierungsmethoden.

Dieses Tutorial führt Sie durch das Konvertieren von Zahlen und Zeichenfolgen und enthält Beispiele, um sich mit den verschiedenen Anwendungsfällen vertraut zu machen.

Zahlentypen konvertieren

Go hat mehrere numerische Typen zur Auswahl. In erster Linie teilen sie sich in zwei allgemeine Typen auf:integers undfloating-point numbers.

Es gibt viele Situationen, in denen Sie möglicherweise zwischen numerischen Typen konvertieren möchten. Das Konvertieren zwischendifferent sizes of numeric types kann dazu beitragen, die Leistung für bestimmte Arten von Systemarchitekturen zu optimieren. Wenn Sie eine Ganzzahl aus einem anderen Teil Ihres Codes haben und diese aufteilen möchten, können Sie die Ganzzahl in einen Gleitkommawert umwandeln, um die Genauigkeit der Operation zu erhalten. Darüber hinaus beinhaltet das Arbeiten mit Zeitdauern normalerweise eine Ganzzahlkonvertierung. Um diesen Situationen zu begegnen, verfügt Go für die meisten numerischen Typen über integriertetype conversions.

Konvertieren zwischen Integer-Typen

Go hat viele ganzzahlige Datentypen zur Auswahl. Wann übereinander verwendet werden soll, liegt in der Regel bei mehr (performance; Es wird jedoch Zeiten geben, in denen Sie von einem Ganzzahltyp in einen anderen konvertieren müssen. Beispielsweise generiert Go manchmal automatisch numerische Werte alsint, die möglicherweise nicht mit Ihrem Eingabewert übereinstimmen. Wenn Ihr Eingabewertint64 wäre, könnten Sie die Zahlenint undint64 nicht im selben mathematischen Ausdruck verwenden, bis Sie ihre Datentypen entsprechend konvertiert haben.

Angenommen, Sie haben einint8 und müssen es in einint32 konvertieren. Sie können dies tun, indem Sie es in die Typkonvertierung vonint32()einschließen:

var index int8 = 15

var bigIndex int32

bigIndex = int32(index)

fmt.Println(bigIndex)
Output15

Dieser Codeblock definiertindex alsint8 Datentyp undbigIndex alsint32 Datentyp. Um den Wert vonindex inbigIndex zu speichern, wird der Datentyp inint32 konvertiert. Dies erfolgt durch Umschließen derint32()-Konvertierung um dieindex-Variable.

Um Ihre Datentypen zu überprüfen, können Sie die Anweisungfmt.Printf und das Verb%T mit der folgenden Syntax verwenden:

fmt.Printf("index data type:    %T\n", index)
fmt.Printf("bigIndex data type: %T\n", bigIndex)
Outputindex data type:    int8
bigIndex data type: int32

Da hierfür das Verb%Tverwendet wird, gibt die print-Anweisung den Typ für die Variable und nicht den tatsächlichen Wert der Variablen aus. Auf diese Weise können Sie den konvertierten Datentyp bestätigen.

Sie können auch eine größere Ganzzahl in eine kleinere Ganzzahl konvertieren:

var big int64 = 64

var little int8

little = int8(big)

fmt.Println(little)
Output64

Beachten Sie, dass Sie beim Konvertieren von Ganzzahlen möglicherweise den Maximalwert des Datentyps undwraparound überschreiten können:

var big int64 = 129
var little = int8(big)
fmt.Println(little)
Output-127

Ein Wraparound tritt auf, wenn der Wert in einen Datentyp konvertiert wird, der zu klein ist, um ihn aufzunehmen. Im vorhergehenden Beispiel hatte der 8-Bit-Datentypint8 nicht genügend Speicherplatz, um die 64-Bit-Variablebig aufzunehmen. Gehen Sie beim Konvertieren von einem Datentyp mit einer größeren Zahl in einen Datentyp mit einer kleineren Zahl immer vorsichtig vor, damit Sie die Daten nicht versehentlich kürzen.

Ganzzahlen in Floats konvertieren

Das Konvertieren von Ganzzahlen in Gleitkommazahlen in Go ähnelt dem Konvertieren eines Ganzzahltyps in einen anderen. Sie können die integrierten Typkonvertierungen verwenden, indem Siefloat64() oderfloat32() um die zu konvertierende Ganzzahl wickeln:

var x int64 = 57

var y float64 = float64(x)

fmt.Printf("%.2f\n", y)
Output57.00

Dieser Code deklariert eine Variablex vom Typint64 und initialisiert ihren Wert auf57.

var x int64 = 57

Wenn Sie diefloat64()-Konvertierung umx wickeln, wird der Wert von57 in einen Gleitkommawert von57.00 konvertiert.

var y float64 = float64(x)

Das Druckverb%.2f weistfmt.Printf an, den Float mit zwei Dezimalstellen zu formatieren.

Sie können diesen Prozess auch für eine Variable verwenden. Der folgende Code deklariertf als57 und druckt dann den neuen Float aus:

var f float64 = 57
fmt.Printf("%.2f\n", f)
Output57.00

Wenn Sie entwederfloat32() oderfloat64() verwenden, können Sie Ganzzahlen in Gleitkommazahlen konvertieren. Als Nächstes lernen Sie, wie Sie Floats in Ganzzahlen konvertieren.

Konvertieren von Floats in Ganzzahlen

Go kann Floats in Ganzzahlen konvertieren, aber das Programm verliert die Genauigkeit des Floats.

Das Umschließen von Floats inint() oder einem seiner architekturunabhängigen Datentypen funktioniert ähnlich wie beim Konvertieren von einem Integer-Typ in einen anderen. Sie können eine Gleitkommazahl in die Klammern einfügen, um sie in eine Ganzzahl umzuwandeln:

var f float64 = 390.8
var i int = int(f)

fmt.Printf("f = %.2f\n", f)
fmt.Printf("i = %d\n", i)
Outputf = 390.80
i = 390

Diese Syntax würde die float390.8 in die Ganzzahl390 konvertieren und die Dezimalstelle löschen.

Sie können dies auch mit Variablen verwenden. Der folgende Code deklariertb als125.0 undc als390.8 und druckt sie dann als ganze Zahlen aus. Kurze Variablendeklaration (:=) verkürzt die Syntax:

b := 125.0
c := 390.8

fmt.Println(int(b))
fmt.Println(int(c))
Output125
390

Wenn Sie Floats in Ganzzahlen vom Typint()konvertieren, schneidet Go die Dezimal- und verbleibenden Zahlen eines Floats ab, um eine Ganzzahl zu erstellen. Beachten Sie, dass Go dies nicht über den Typint()tun wird, auch wenn Sie 390.8 auf 391 runden möchten. Stattdessen wird die Dezimalstelle gelöscht.

Durch Division umgerechnete Zahlen

Wenn Sie Ganzzahltypen in Go teilen, ist das Ergebnis auch ein Ganzzahltyp, wobei diemodulus oder der Rest gelöscht werden:

a := 5 / 2
fmt.Println(a)
Output2

Wenn beim Teilen einer der Zahlentypen ein Gleitkomma ist, werden alle Typen automatisch als Gleitkomma deklariert:

    a := 5.0 / 2
    fmt.Println(a)
Output2.5

Dies dividiert den Float5.0 durch die Ganzzahl2, und die Antwort2.5 ist ein Float, der die Dezimalgenauigkeit beibehält.

In diesem Abschnitt haben Sie zwischen verschiedenen Zahlendatentypen konvertiert, einschließlich verschiedener Größen von Ganzzahlen und Gleitkommazahlen. Als Nächstes lernen Sie, wie Sie zwischen Zahlen und Zeichenfolgen konvertieren.

Mit Strings konvertieren

Astring ist eine Folge von einem oder mehreren Zeichen (Buchstaben, Zahlen oder Symbole). Zeichenfolgen sind eine häufige Form von Daten in Computerprogrammen, und Sie müssen möglicherweise häufig Zeichenfolgen in Zahlen oder Zahlen in Zeichenfolgen konvertieren, insbesondere wenn Sie vom Benutzer generierte Daten erfassen.

Zahlen in Strings konvertieren

Sie können Zahlen in Zeichenfolgen konvertieren, indem Sie die Methodestrconv.Itoa aus dem Paketstrconv in der Go-Standardbibliothek verwenden. Wenn Sie eine Zahl oder eine Variable in die Klammern der Methode eingeben, wird dieser numerische Wert in einen Zeichenfolgenwert umgewandelt.

Schauen wir uns zunächst die Konvertierung von Ganzzahlen an. Um die Ganzzahl12 in einen Zeichenfolgenwert umzuwandeln, können Sie12 an die Methodestrconv.Itoa übergeben:

package main

import (
    "fmt"
    "strconv"
)

func main() {
    a := strconv.Itoa(12)
    fmt.Printf("%q\n", a)
}

Wenn Sie dieses Programm ausführen, erhalten Sie die folgende Ausgabe:

Output"12"

Die Anführungszeichen um die Zahl 12 bedeuten, dass die Zahl keine ganze Zahl mehr ist, sondern jetzt ein Zeichenfolgenwert.

Sie haben den Zuweisungsoperator:=verwendet, um sowohl eine neue Variable mit dem Namena zu deklarieren als auch den von der Funktionstrconv.Itoa() zurückgegebenen Wert zuzuweisen. In diesem Fall haben Sie Ihrer Variablen den Wert12 zugewiesen. Sie haben auch das Verb%q in der Funktionfmt.Printf verwendet, die die Funktion anweist, die angegebene Zeichenfolge in Anführungszeichen zu setzen.

Mit Variablen können Sie sehen, wie praktisch es sein kann, Ganzzahlen in Zeichenfolgen umzuwandeln. Angenommen, Sie möchten den täglichen Programmierfortschritt eines Benutzers verfolgen und geben ein, wie viele Codezeilen gleichzeitig geschrieben werden. Sie möchten dem Benutzer dieses Feedback anzeigen und drucken gleichzeitig Zeichenfolge- und Ganzzahlwerte aus:

package main

import (
    "fmt"
)

func main() {
    user := "Sammy"
    lines := 50

    fmt.Println("Congratulations, " + user + "! You just wrote " + lines + " lines of code.")
}

Wenn Sie diesen Code ausführen, wird folgende Fehlermeldung angezeigt:

Outputinvalid operation: ("Congratulations, " + user + "! You just wrote ") + lines (mismatched types string and int)

Sie können Zeichenfolgen und Ganzzahlen in Go nicht verketten, daher müssen Sie die Variablelines in einen Zeichenfolgenwert konvertieren:

package main

import (
    "fmt"
    "strconv"
)

func main() {
    user := "Sammy"
    lines := 50

    fmt.Println("Congratulations, " + user + "! You just wrote " + strconv.Itoa(lines) + " lines of code.")
}

Wenn Sie jetzt den Code ausführen, erhalten Sie die folgende Ausgabe, die Ihren Benutzern zu ihrem Fortschritt gratuliert:

OutputCongratulations, Sammy! You just wrote 50 lines of code.

Wenn Sie einen Gleitkommawert in eine Zeichenfolge anstatt in eine Ganzzahl in eine Zeichenfolge konvertieren möchten, befolgen Sie ähnliche Schritte und Formate. Wenn Sie ein Float an diefmt.Sprint-Methode übergeben, wird aus demfmt-Paket in der Go-Standardbibliothek ein Zeichenfolgenwert des float zurückgegeben. Sie können entweder den Gleitkommawert selbst oder eine Variable verwenden:

package main

import (
    "fmt"
)

func main() {
    fmt.Println(fmt.Sprint(421.034))

    f := 5524.53
    fmt.Println(fmt.Sprint(f))
}
Output421.034
5524.53

Sie können testen, ob es richtig ist, indem Sie mit einer Zeichenfolge verknüpfen:

package main

import (
    "fmt"
)

func main() {
    f := 5524.53
    fmt.Println("Sammy has " + fmt.Sprint(f) + " points.")
}
OutputSammy has 5524.53 points.

Sie können sicher sein, dass Ihr Float ordnungsgemäß in eine Zeichenfolge konvertiert wurde, da die Verkettung fehlerfrei durchgeführt wurde.

Konvertieren von Zeichenfolgen in Zahlen

Zeichenfolgen können mithilfe des Paketsstrconv in der Go-Standardbibliothek in Zahlen konvertiert werden. Dasstrconv-Paket verfügt über Funktionen zum Konvertieren von Integer- und Float-Zahlentypen. Dies ist eine sehr häufige Operation, wenn Eingaben vom Benutzer akzeptiert werden. Wenn Sie beispielsweise ein Programm hatten, in dem nach dem Alter einer Person gefragt wurde, wird diese beim Eingeben der Antwort alsstring erfasst. Sie müssten es dann inint konvertieren, um damit rechnen zu können.

Wenn Ihre Zeichenfolge keine Dezimalstellen hat, möchten Sie sie höchstwahrscheinlich mithilfe der Funktionstrconv.Atoiin eine Ganzzahl konvertieren. Wenn Sie wissen, dass Sie die Zahl als Float verwenden, verwenden Siestrconv.ParseFloat.

Nehmen wir das Beispiel des Benutzers Sammy, der jeden Tag die Codezeilen protokolliert. Möglicherweise möchten Sie diese Werte mit Mathematik bearbeiten, um dem Benutzer ein interessanteres Feedback zu geben. Diese Werte werden jedoch derzeit in Zeichenfolgen gespeichert:

package main

import (
    "fmt"
)

func main() {
    lines_yesterday := "50"
    lines_today := "108"

    lines_more := lines_today - lines_yesterday

    fmt.Println(lines_more)
}
Outputinvalid operation: lines_today - lines_yesterday (operator - not defined on string)

Da die beiden numerischen Werte in Zeichenfolgen gespeichert wurden, haben Sie eine Fehlermeldung erhalten. Der Operand- für die Subtraktion ist kein gültiger Operand für zwei Zeichenfolgenwerte.

Ändern Sie den Code so, dass er die Methodestrconv.Atoi()enthält, mit der die Zeichenfolgen in Ganzzahlen konvertiert werden. Auf diese Weise können Sie mit Werten rechnen, die ursprünglich Zeichenfolgen waren. Da beim Konvertieren einer Zeichenfolge in eine Ganzzahl möglicherweise ein Fehler auftritt, müssen Sie nach Fehlern suchen. Mit der Anweisungifkönnen Sie überprüfen, ob Ihre Konvertierung erfolgreich war.

package main

import (
    "fmt"
    "log"
    "strconv"
)

func main() {
    lines_yesterday := "50"
    lines_today := "108"

    yesterday, err := strconv.Atoi(lines_yesterday)
    if err != nil {
        log.Fatal(err)
    }

    today, err := strconv.Atoi(lines_today)
    if err != nil {
        log.Fatal(err)
    }
    lines_more := today - yesterday

    fmt.Println(lines_more)
}

Da es möglich ist, dass eine Zeichenfolge keine Zahl ist, gibt die Methodestrconv.Atoi()owohl den konvertierten Typ als auch einen potenziellen Fehler zurück. Wenn Sie mit der Funktionstrconv.Atoi vonlines_yesterday konvertieren, müssen Sie den Rückgabewert vonerrüberprüfen, um sicherzustellen, dass der Wert konvertiert wurde. Wennerr nichtnil ist, bedeutet dies, dassstrconv.Atoi den Zeichenfolgenwert nicht erfolgreich in eine Ganzzahl konvertieren konnte. In diesem Beispiel haben Sie eineif-Anweisung verwendet, um nach dem Fehler zu suchen. Wenn ein Fehler zurückgegeben wurde, haben Sielog.Fatal verwendet, um den Fehler zu protokollieren und das Programm zu beenden.

Wenn Sie den vorhergehenden Code ausführen, erhalten Sie:

Output58

Versuchen Sie nun, eine Zeichenfolge zu konvertieren, die keine Zahl ist:

package main

import (
    "fmt"
    "strconv"
)

func main() {
    a := "not a number"
    b, err := strconv.Atoi(a)
    fmt.Println(b)
    fmt.Println(err)
}

Sie erhalten folgende Fehlermeldung:

Output0
strconv.Atoi: parsing "not a number": invalid syntax

Dab deklariert wurde,strconv.Atoi jedoch keine Konvertierung durchführte, wurdeb niemals ein Wert zugewiesen. Beachten Sie, dassb den Wert0 hat. Dies liegt daran, dass Go über Standardwerte verfügt, die in Go als Nullwerte bezeichnet werden. strconv.Atoi liefert einen Fehler, der beschreibt, warum die Zeichenfolge ebenfalls nicht konvertiert werden konnte.

Konvertieren von Strings und Bytes

Strings in Go werden als Byte-Slice gespeichert. In Go können Sie zwischen einem Byte-Slice und einem String konvertieren, indem Sie ihn in die entsprechenden Konvertierungen von[]byte() undstring() einschließen:

package main

import (
    "fmt"
)

func main() {
    a := "my string"

    b := []byte(a)

    c := string(b)

    fmt.Println(a)

    fmt.Println(b)

    fmt.Println(c)
}

Hier haben Sie einen Zeichenfolgenwert ina gespeichert, ihn dann in einen Byte-Sliceb konvertiert und den Byte-Slice dann wieder in einen String alsc konvertiert. Anschließend drucken Siea,b undc auf den Bildschirm:

Outputmy string
[109 121 32 115 116 114 105 110 103]
my string

Die erste Ausgabezeile ist die ursprüngliche Zeichenfolgemy string. Die zweite Zeile, die ausgedruckt wird, ist das Byte-Segment, aus dem die ursprüngliche Zeichenfolge besteht. Die dritte Zeile zeigt, dass der Byte-Slice sicher wieder in einen String umgewandelt und ausgedruckt werden kann.

Fazit

In diesem Go-Lernprogramm wurde gezeigt, wie mehrere wichtige native Datentypen in andere Datentypen konvertiert werden, hauptsächlich mithilfe integrierter Methoden. Wenn Sie Datentypen in Go konvertieren können, können Sie beispielsweise Benutzereingaben akzeptieren und Berechnungen für verschiedene Zahlentypen durchführen. Wenn Sie später Go verwenden, um Programme zu schreiben, die Daten aus vielen verschiedenen Quellen wie Datenbanken und APIs akzeptieren, verwenden Sie diese Konvertierungsmethoden, um sicherzustellen, dass Sie auf Ihre Daten reagieren können. Sie können den Speicher auch optimieren, indem Sie Daten in kleinere Datentypen konvertieren.

Wenn Sie eine eingehendere Analyse der Datentypen in Go wünschen, lesen Sie unseren Artikel zuUnderstanding Data Types in Go.