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?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage