Comprimento máximo de uma fatia no Go
Eu tenho o seguinte código em execução em um sistema operacional Linux de 64 bits em uma máquina 4Gb:
package main
import (
"fmt"
"math"
)
func main() {
r := make([]bool, math.MaxInt32)
fmt.Println("Size: ", len(r))
}
Quando executo isso, recebo:
Size: 2147483647
Se eu mudar omath.MaxInt32
paramath.MaxUint32
Eu recebo:
fatal error: runtime: out of memory
Com tamanho de fatia demath.MaxUint32
Fiquei sem memória, esperava isso, mas quando tento usarmath.MaxInt64
Eu recebo:
panic: runtime error: makeslice: len out of range
Aparentemente, não posso criar uma fatia com um tamanho demath.MaxInt64
, o que nos leva à minha pergunta: se a memória não é um problema, qual é a maior fatia que não consigo criar no Go?
Lembro que, em Java, os índices de matriz bruta são gerenciados com o tipoint
, então o tamanho máximo de uma matriz bruta é o valor máximo de umint
, se você tentar fazer isso comlong
isso gerará uma exceção (tanto quanto me lembro), é o mesmo com o Go? o índice de fatia no Go está vinculado a um tipo específico?
EDITAR:
Eu executei o teste usandostruct{}
ao invés debool
e alocaçãomath.MaxInt64
elementos. Tudo correu como esperado e imprime:
Size: 9223372036854775807
Então, outra pergunta, por que existem duas mensagens de erro diferentes quando parece que o erro é o mesmo (falta de memória)?
Quais são as condições para cada erro aparecer?