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%T
verwendet 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.Atoi
in 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 Anweisungif
kö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.