Maximale Länge eines Slice in Go
Ich habe den folgenden Code in einem 64-Bit-Linux-Betriebssystem auf einem 4-GB-Computer ausgeführt:
package main
import (
"fmt"
"math"
)
func main() {
r := make([]bool, math.MaxInt32)
fmt.Println("Size: ", len(r))
}
Wenn ich das starte bekomme ich:
Size: 2147483647
Wenn ich das @ ändemath.MaxInt32
zummath.MaxUint32
Ich bekomme
fatal error: runtime: out of memory
Mit der Slice-Größe vonmath.MaxUint32
Ich habe keinen Speicher mehr, das habe ich erwartet, aber wenn ich versuche, @ zu verwendmath.MaxInt64
Ich bekomme
panic: runtime error: makeslice: len out of range
Also kann ich kein Slice mit einer Größe von @ erstellmath.MaxInt64
, was uns zu meiner Frage bringt: Wenn der Speicher kein Problem ist, was ist der größte Slice, den ich in Go nicht erstellen kann?
Ich erinnere mich, dass in Java unformatierte Array-Indizes mit dem Typ @ verwaltet werdeint
, daher ist die maximale Größe eines unformatierten Arrays der maximale Wert einesint
, wenn du es versuchst mitlong
es wird eine Ausnahme auslösen (soweit ich mich erinnere), ist es dasselbe mit Go? Sind Slice-Indizes in Go an einen bestimmten Typ gebunden?
BEARBEITEN
Ich habe den Test mit @ ausgefühstruct{}
Anstatt vonbool
und allokierenmath.MaxInt64
Elemente. Alles lief wie erwartet und druckt:
Size: 9223372036854775807
Also noch eine Frage, warum gibt es zwei verschiedene Fehlermeldungen, wenn der Fehler gleich zu sein scheint (nicht genügend Speicher)?
Was sind die Bedingungen, unter denen jeder Fehler angezeigt wird?