Tôi có đoạn code sau chạy trong một hệ điều hành Linux 64-bit trong một máy 4Gb:Chiều dài tối đa của một lát tại Gò
package main
import (
"fmt"
"math"
)
func main() {
r := make([]bool, math.MaxInt32)
fmt.Println("Size: ", len(r))
}
Khi tôi chạy này, tôi nhận được:
Size: 2147483647
Nếu tôi thay đổi math.MaxInt32
cho math.MaxUint32
tôi nhận được:
fatal error: runtime: out of memory
với kích thước lát math.MaxUint32
tôi chạy ra khỏi bộ nhớ, tôi đã mong rằng, nhưng khi tôi thử sử dụng math.MaxInt64
tôi nhận được:
panic: runtime error: makeslice: len out of range
Vì vậy aparently Tôi không thể tạo ra một lát với kích thước của math.MaxInt64
, mà đưa chúng ta đến câu hỏi của tôi: Nếu nhớ không phải là một vấn đề, slice lớn nhất mà tôi không thể tạo trong Go là gì?
Tôi nhớ rằng, trong Java, chỉ số mảng liệu được quản lý bằng các loại int
, vì vậy kích thước tối đa của một mảng nguyên là giá trị tối đa của một int
, nếu bạn cố gắng làm điều đó với long
nó sẽ nâng cao một ngoại lệ (theo như tôi nhớ), nó có giống với Go không? là chỉ mục slice trong Go bị ràng buộc với một loại cụ thể?
EDIT:
tôi chạy thử nghiệm sử dụng struct{}
thay vì bool
và phân bổ math.MaxInt64
yếu tố. Tất cả mọi thứ đã đi như mong đợi, và in:
Size: 9223372036854775807
Vì vậy, một câu hỏi khác, tại sao có hai thông báo lỗi khác nhau khi có vẻ như rằng lỗi là như nhau (không đủ bộ nhớ)?
Các điều kiện cho từng lỗi xuất hiện là gì?
Vì vậy, có vẻ như đó là một vấn đề của sự nhập nhằng thông báo lỗi, không có gì hơn ... :) –