Heim >Backend-Entwicklung >Golang >Was begrenzt die maximale Größe eines Go-Slices und warum machen leere Strukturen einen Unterschied?

Was begrenzt die maximale Größe eines Go-Slices und warum machen leere Strukturen einen Unterschied?

Susan Sarandon
Susan SarandonOriginal
2024-12-12 14:48:12196Durchsuche

What Limits the Maximum Size of a Go Slice, and Why Do Empty Structs Make a Difference?

Maximale Länge eines Slice in Go

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn