Mam następujący kod działa w 64-bitowym systemie operacyjnym Linux w komputerze 4Gb:Maksymalna długość segmentu w Go
package main
import (
"fmt"
"math"
)
func main() {
r := make([]bool, math.MaxInt32)
fmt.Println("Size: ", len(r))
}
Kiedy uruchamiam to uzyskać:
Size: 2147483647
Jeśli I zmienić math.MaxInt32
dla math.MaxUint32
uzyskać:
fatal error: runtime: out of memory
z wielkości wlewu math.MaxUint32
Pobiegłem z pamięci, spodziewałem się tego, ale gdy próbuję za pomocą math.MaxInt64
uzyskać:
panic: runtime error: makeslice: len out of range
Więc aparently Nie mogę utworzyć kawałek o wielkości math.MaxInt64
, która doprowadzi nas do mojego pytania: Jeśli pamięć nie jest problem, jaki jest największy kawałek, którego nie mogę stworzyć w Go?
Pamiętam, że w Javie, surowe indeksy tablicy są zarządzane z typem int
, więc maksymalna wielkość surowego tablicy jest wartość max o int
, jeśli starają się zrobić z long
to podniesie wyjątek (o ile pamiętam), czy tak samo jest z Go? są indeksem plastra w Go powiązanym z jednym określonym typem?
EDIT:
Pobiegłem test używając struct{}
zamiast bool
i przydzielanie math.MaxInt64
elementy. Wszystko poszło zgodnie z oczekiwaniami, a drukuje:
Size: 9223372036854775807
Więc kolejne pytanie, dlaczego istnieją dwa różne komunikaty o błędach, gdy wydaje się, że błąd jest taki sam (mało pamięci)?
Jakie są warunki wyskakiwania każdego błędu?
Wygląda więc na to, że jest to kwestia komunikatu o błędzie niejednoznaczności, nic więcej ... :) –