Menu

Golang Datentypen: int, float64, string, bool, byte, rune

Die eingebauten Typen von Go: Größen und Wertebereiche der Ganzzahlen, float32 und float64, bool, string, byte und rune, komplexe Zahlen, Nullwerte und wie du den Typ eines Werts mit %T ausgibst.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

Die Basistypen von Go sind Zahlen, Booleans und Strings. Jede Variable hat genau einen Typ, der zur Compilezeit feststeht, und Go konvertiert nie von selbst zwischen Typen. %T gibt den Typ jedes Werts aus:

Beachte, dass 'G' als 71 mit dem Typ int32 ausgegeben wird: Ein Zeichen in einfachen Anführungszeichen ist eine Rune, und die ist eine Zahl (der Unicode-Codepoint). rune ist ein Alias für int32 (derselbe Typ unter einem zweiten Namen), also meldet %T int32. Ebenso meldet byte uint8.

Ganzzahlen

TypGrößeBereich
int88 Bit-128 bis 127
int1616 Bit-32.768 bis 32.767
int3232 Bitetwa -2,1 Milliarden bis 2,1 Milliarden
int6464 Bitetwa -9,2 Trillionen bis 9,2 Trillionen
uint8 (byte)8 Bit0 bis 255
uint1616 Bit0 bis 65.535
uint3232 Bit0 bis etwa 4,3 Milliarden
uint6464 Bit0 bis etwa 18,4 Trillionen
int, uint32 oder 64 BitWortgröße der Plattform
uintptrPlattformgrößeenthält einen Pointer-Wert, für Low-Level-Code

Nimm standardmäßig int. len() gibt int zurück, Slice-Indizes sind int, und Schleifenzähler sind int. Auf jeder 64-Bit-Plattform hat int 64 Bit. Zu Typen mit fester Größe greifst du, wenn die Größe Teil eines Vertrags ist: int32 in einem binären Dateiformat, uint8 für Rohbytes, int64 für einen Unix-Zeitstempel in Nanosekunden.

Vermeide vorzeichenlose Typen für Mengen, die „nicht negativ sein können“, etwa Anzahlen. Subtrahierst du über null hinaus, springt der Wert auf eine riesige Zahl, statt eine negative zu ergeben, die du abfangen könntest.

Grenzen und Überlauf

Das Paket math hat für jede Grenze eine Konstante. Zur Laufzeit läuft Ganzzahlarithmetik, die überläuft, still herum:

Keine Panic, kein Fehler: 127 + 1 wird zu -128. Nur konstante Ausdrücke werden zur Compilezeit geprüft (var b int8 = 128 kompiliert nicht). Kann in deinen Daten ein Überlauf auftreten, prüf vor der Operation oder nimm math/big.

Ganzzahlliterale

million := 1_000_000   // underscores for readability (Go 1.13+)
mask := 0xFF           // hexadecimal
perm := 0o755          // octal (also the older form 0755)
flags := 0b1010        // binary

Gleitkommazahlen

TypGrößeGenauigkeit
float3232 Bitetwa 6 bis 9 signifikante Stellen
float6464 Bitetwa 15 bis 17 signifikante Stellen

Ein Literal mit Dezimalpunkt oder Exponent (2.5, 1e6) ist standardmäßig float64, und das Paket math nimmt und liefert float64. Nimm es, außer der Speicher in einem großen Array zählt.

Floats sind binär, also sind die meisten Dezimalbrüche Näherungen:

Daraus folgen zwei Regeln. Vergleiche Floats nach Berechnungen nie mit ==. Und speichere Geld nie in einem Float: Nimm eine ganze Zahl von Cent oder eine Dezimalbibliothek.

Einen Float durch null zu teilen ergibt +Inf, -Inf oder NaN statt einer Panic. Eine Ganzzahl durch null zu teilen löst zur Laufzeit eine Panic aus (runtime error: integer divide by zero), und ein konstanter Divisor null ist ein Compilerfehler.

Booleans

bool enthält true oder false, und sein Nullwert ist false. Go behandelt Zahlen, leere Strings oder nil nicht als Booleans. if count {} ist ein Compilerfehler; schreib if count > 0 {}. Die Operatoren sind &&, || und !, und && und || werten kurzschließend aus.

Strings

Ein string ist eine unveränderliche Folge von Bytes, meist UTF-8-Text. len(s) zählt Bytes, keine Zeichen:

é belegt in UTF-8 zwei Bytes, also meldet len 6 für fünf Zeichen. Strings in doppelten Anführungszeichen verarbeiten Escapes wie \n; Raw Strings in Backquotes tun das nicht und können über mehrere Zeilen gehen. Die Seite zu Strings behandelt das Paket strings, und die Seite zu Runes und Bytes erklärt UTF-8 im Detail.

byte und rune

AliasGleich wieEnthält
byteuint8ein Byte Rohdaten
runeint32einen Unicode-Codepoint

Das sind Aliase, keine neuen Typen: Ein byte und ein uint8 sind ohne Konvertierung austauschbar. Die Namen sagen, was die Zahl bedeutet.

Komplexe Zahlen

Go hat eingebaute komplexe Typen, complex64 und complex128, mit real, imag und dem Paket math/cmplx:

Wenige Programme brauchen sie, aber Signalverarbeitung und mancher numerische Code schon.

Zusammengesetzte Typen und Referenztypen

Die Basistypen lassen sich zu zusammengesetzten kombinieren. Jeder hat seine eigene Seite:

TypBeispielNullwert
Array[3]intdrei Nullen
Slice[]intnil
Mapmap[string]intnil
Structstruct{ X, Y int }jedes Feld genullt
Pointer*intnil
Funktionfunc(int) intnil
Channelchan intnil
Interfaceerror, anynil

any ist (seit Go 1.18) ein Alias für interface{} und kann einen Wert beliebigen Typs enthalten.

Benannte Typen

Du kannst aus einem vorhandenen Typ einen neuen definieren. Er hat dieselbe Darstellung, ist aber ein eigener Typ und kann Methoden haben:

type Celsius float64
type UserID int64

var t Celsius = 21.5
var f float64 = t // compile error: cannot use t (variable of float64 type Celsius) as float64 value in variable declaration

Genau diese Strenge ist der Sinn: Eine UserID lässt sich nicht versehentlich übergeben, wo eine OrderID erwartet wird. Konvertiere explizit, wenn du es so meinst: float64(t). Die Regeln stehen auf der Seite zur Typkonvertierung, und für den Weg zwischen Zahlen und Strings gibt es die Funktionen aus strconv.

Nullwerte

Jeder Typ hat einen Nullwert. Den enthält eine Variable, bevor du ihr etwas zuweist: 0 für Zahlen, false für bool, "" für Strings und nil für Pointer, Slices, Maps, Channels, Funktionen und Interfaces. Nicht initialisierte Variablen gibt es in Go nicht.

Häufig gestellte Fragen

Wie groß ist ein int in Go?

int und uint haben auf 64-Bit-Plattformen (amd64, arm64) 64 Bit und auf 32-Bit-Plattformen 32 Bit. Brauchst du eine feste Größe, etwa für ein Dateiformat oder ein Netzwerkprotokoll, nimm int32, int64, uint8 und so weiter. Für gewöhnliche Zähler, Indizes und Längen nimm int.

Wie gebe ich in Go den Typ einer Variablen aus?

Mit dem Verb %T: fmt.Printf("%T\n", x) gibt int, float64, []string, main.User und so weiter aus. Im Code liefert reflect.TypeOf(x) dieselbe Information als Wert, den du untersuchen kannst.

Was ist der Unterschied zwischen byte und rune in Go?

byte ist ein Alias für uint8 und enthält ein Byte Rohdaten. rune ist ein Alias für int32 und enthält einen Unicode-Codepoint. Ein String ist eine Folge von Bytes; iterierst du mit for range darüber, wird er in Runes dekodiert.

Sollte ich in Go float32 oder float64 verwenden?

Nimm float64, außer du hast einen Grund dagegen. Es ist der Standardtyp von Gleitkommaliteralen, der Typ, mit dem das Paket math arbeitet, und hat eine Genauigkeit von etwa 15 bis 17 signifikanten Dezimalstellen gegenüber etwa 6 bis 9 bei float32. Wähl float32 nur, um in großen Arrays Speicher zu halbieren oder um ein externes Format zu treffen.

Was ist der Maximalwert von int in Go?

Nimm die Konstanten aus dem Paket math: math.MaxInt (9223372036854775807 auf 64-Bit-Plattformen), math.MinInt, math.MaxInt64, math.MaxUint32 und so weiter. Arithmetik, die über die Grenze hinausgeht, läuft zur Laufzeit still über; sie löst keine Panic aus.

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S