Longitud máxima de un segmento en Go

Tengo el siguiente código ejecutándose en un sistema operativo Linux de 64 bits en una máquina de 4 Gb:

package main

import (
    "fmt"
    "math"
)

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

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

Cuando ejecuto esto obtengo:

Size: 2147483647

Si cambio elmath.MaxInt32 paramath.MaxUint32 Yo obtengo:

fatal error: runtime: out of memory

Con un tamaño de corte demath.MaxUint32 Me quedé sin memoria, esperaba eso, pero cuando trato de usarmath.MaxInt64 Yo obtengo:

panic: runtime error: makeslice: len out of range

Aparentemente, no puedo crear un segmento con un tamaño demath.MaxInt64, lo que nos lleva a mi pregunta: si la memoria no es un problema, ¿cuál es la porción más grande que no puedo crear en Go?

Recuerdo que, en Java, los índices de matriz sin procesar se gestionan con el tipoint, por lo que el tamaño máximo de una matriz sin formato es el valor máximo de unint, si intentas hacerlo conlong provocará una excepción (por lo que recuerdo), ¿es lo mismo con Go? ¿El índice de corte en Go está vinculado a un tipo específico?

EDITAR:

Ejecuté la prueba usandostruct{} en lugar debool y asignandomath.MaxInt64 elementos. Todo salió como se esperaba y se imprime:

Size: 9223372036854775807

Entonces, otra pregunta, ¿por qué hay dos mensajes de error diferentes cuando parece que el error es el mismo (no hay suficiente memoria)?

¿Cuáles son las condiciones para que aparezca cada error?

Respuestas a la pregunta(1)

Su respuesta a la pregunta