您在嘗試在 Go 中建立各種大小的切片時遇到了記憶體分配問題。讓我們深入探討一下這些限制背後的原因。
根據 Go 文檔,切片元素的索引值範圍為 0 到 len(s)-1,這表示切片的最大容量由目標建構上的本機整數的大小。
在檢查原始碼時,我們發現了一個安全檢查,可確保創建特定大小的切片是可行:
if len64 < 0 || int64(len) != len64 || t.elem.size > 0 && uintptr(len) > maxmem/uintptr(t.elem.size) { panic(errorString("makeslice: len out of range")) }
在您的情況下,條件uintptr(len) > maxmem/uintptr(t.elem.size) 變成true,禁止請求的分配。這是因為切片所需的記憶體將超過最大記憶體限制。
但是,當您分配一個不消耗記憶體的空結構切片時,相同的分配大小是允許的:
r := make([]struct{}, math.MaxInt64)
這是因為評估記憶體需求的條件變為false,因為空結構不消耗記憶體。 Go 允許為此類類型建立具有非常大容量的切片。
以上是是什麼限制了 Go 切片的最大大小,以及為什麼空結構會產生影響?的詳細內容。更多資訊請關注PHP中文網其他相關文章!