Longueur maximale d'une tranche en Aller

J'ai le code suivant s'exécute dans un linux 64-bit OS 4go machine:

package main

import (
    "fmt"
    "math"
)

func main() {
    r := make([]bool, math.MaxInt32)

    fmt.Println("Size: ", len(r))
}

Lorsque je l'exécute j'obtiens:

Size: 2147483647

Si je change le math.MaxInt32 pour math.MaxUint32 j'obtiens:

fatal error: runtime: out of memory

Avec la taille de la tranche de math.MaxUint32 j'ai couru hors de la mémoire, je m'attendais à ça, mais quand j'ai essayer d'utiliser math.MaxInt64 j'obtiens:

panic: runtime error: makeslice: len out of range

Donc aparently je ne peux pas créer une tranche avec une taille de math.MaxInt64, ce qui nous amène à ma question: Si la mémoire n'est pas un problème, ce qui est la part la plus importante que je ne peux pas créer de Go?

Je me souviens que, en Java, en matières index de tableau sont gérés avec le type int, de sorte que la taille maximale d'un raw de tableau est la valeur max d'un int, si vous essayez de le faire avec long, il déclenche une exception (comme je me souviens bien), est-il de même au rendez-vous? sont de la tranche d'index en Aller lié à un type spécifique?

EDIT:

J'ai couru le test à l'aide de struct{} au lieu de bool et de l'allocation de math.MaxInt64 éléments. Tout se passe comme prévu, et imprime:

Size: 9223372036854775807

Alors, une autre question, pourquoi il y a deux différents messages d'erreur lorsqu'il semble que l'erreur est la même (pas assez de mémoire)?

Quelles sont les conditions pour chaque erreur de la pop?

Il semble donc que c'est une question de message d'erreur ambiguïté, rien de plus... 🙂

OriginalL'auteur Simón Oroño | 2014-12-25