Heim >Backend-Entwicklung >Golang >Was begrenzt die maximale Größe eines Go-Slices und warum machen leere Strukturen einen Unterschied?
Beim Versuch, Slices mit verschiedenen Größen in Go zu erstellen, sind Probleme bei der Speicherzuordnung aufgetreten. Lassen Sie uns tiefer auf die Gründe für diese Einschränkungen eingehen.
Laut der Go-Dokumentation haben Slice-Elemente Indexwerte im Bereich von 0 bis len(s)-1, was darauf hinweist, dass die maximale Kapazität für ein Slice durch bestimmt wird Größe der nativen Ganzzahl auf dem Ziel-Build.
Bei der Untersuchung des Quellcodes entdecken wir eine Sicherheitsprüfung, die sicherstellt, dass Slices bestimmter Größen erstellt werden machbar:
if len64 < 0 || int64(len) != len64 || t.elem.size > 0 && uintptr(len) > maxmem/uintptr(t.elem.size) { panic(errorString("makeslice: len out of range")) }
In Ihrem Fall ist die Bedingung uintptr(len) > maxmem/uintptr(t.elem.size) wird wahr und verhindert die angeforderte Zuweisung. Dies liegt daran, dass der für das Slice erforderliche Speicher das maximale Speicherlimit überschreiten würde.
Wenn Sie jedoch ein Slice mit leeren Strukturen zuweisen, die keinen Speicher verbrauchen, wird dieselbe Zuweisungsgröße zulässig:
r := make([]struct{}, math.MaxInt64)
Dies liegt daran, dass die Bedingung zur Bewertung des Speicherbedarfs falsch wird, da die leeren Strukturen keinen Speicher verbrauchen. Go ermöglicht die Erstellung von Slices mit sehr großen Kapazitäten für solche Typen.
Das obige ist der detaillierte Inhalt vonWas begrenzt die maximale Größe eines Go-Slices und warum machen leere Strukturen einen Unterschied?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!