Maison >développement back-end >Golang >Qu'est-ce qui limite la taille maximale d'une Go Slice et pourquoi les structures vides font-elles une différence ?
Vous avez rencontré des problèmes d'allocation de mémoire en essayant de créer des tranches de différentes tailles dans Go. Examinons plus en détail les raisons de ces limitations.
Selon la documentation Go, les éléments de tranche ont des valeurs d'index allant de 0 à len(s)-1, indiquant que la capacité maximale d'une tranche est déterminée par le taille de l'entier natif sur la build cible.
En examinant le code source, nous découvrons un contrôle de sécurité qui garantit que la création de tranches de certaines tailles est réalisable :
if len64 < 0 || int64(len) != len64 || t.elem.size > 0 && uintptr(len) > maxmem/uintptr(t.elem.size) { panic(errorString("makeslice: len out of range")) }
Dans votre cas, la condition uintptr(len) > maxmem/uintptr(t.elem.size) devient vrai, interdisant l'allocation demandée. En effet, la mémoire requise pour la tranche dépasserait la limite de mémoire maximale.
Cependant, lorsque vous allouez une tranche de structures vides, qui ne consomment aucune mémoire, la même taille d'allocation devient autorisée :
r := make([]struct{}, math.MaxInt64)
En effet, la condition évaluant les besoins en mémoire devient fausse puisque les structures vides ne consomment aucune mémoire. Go permet de créer des tranches de très grandes capacités pour de tels types.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!