我正在嘗試了解有關內存使用的更多信息。對interface{}和struct{}切片進行一些測試,我注意到切片struct{}不分配任何內存,而切片則分配任何內存interface{}。這對我來說沒有多大意義,我實際上期望相同的行為(即兩者都不分配任何內容)。無論如何,我找不到關于這個特殊案例的任何解釋。有人可以解釋一下為什么會發生這種情況嗎?package mainimport ( "runtime" "fmt")func main() { // Below is an example of using our PrintMemUsage() function // Print our starting memory usage (should be around 0mb) fmt.Println("Start") PrintMemUsage() fmt.Println("") structContainer := make([]struct{}, 1000000) for i := 0; i<1000000; i++ { structContainer[i] = struct{}{} } fmt.Println("With 1kk struct{}") PrintMemUsage() fmt.Println("") nilContainer := make([]interface{}, 1000000) for i := 0; i<1000000; i++ { nilContainer[i] = nil } fmt.Println("With 1kk nil interface{}") PrintMemUsage() fmt.Println("")}// PrintMemUsage outputs the current, total and OS memory being used. As well as the number // of garage collection cycles completed.func PrintMemUsage() { var m runtime.MemStats runtime.ReadMemStats(&m) // For info on each, see: https://golang.org/pkg/runtime/#MemStats fmt.Printf("Alloc = %v KiB", bToMb(m.Alloc)) fmt.Printf("\tTotalAlloc = %v KiB", bToMb(m.TotalAlloc)) fmt.Printf("\tSys = %v KiB", bToMb(m.Sys)) fmt.Printf("\tNumGC = %v\n", m.NumGC)}func bToMb(b uint64) uint64 { return b / 1024}
2 回答

夢里花落0921
TA貢獻1772條經驗 獲得超6個贊
這是因為空結構不包含任何值。
這對于數組或切片來說不是很有用。但它對于地圖很有用。沒有價值的地圖就像一套。您可以插入密鑰并測試它們是否存在。正如您所發現的,缺乏價值可以節省空間。

慕無忌1623718
TA貢獻1744條經驗 獲得超4個贊
類型變量interface{}
可以保存任何值。例如,它可以保存整數8
,可以保存string
值"hi"
,可以保存結構值image.Point{X: 1, Y: 2}
以及幾乎所有其他內容。
如果您分配一個具有interface{}
其元素類型的切片,則必須分配內存,以便您可以在其元素中存儲任何值。當使用make()
分配它時,它的所有元素都將獲得元素類型的零值(這是nil
針對interface{}
),但仍然需要分配內存,否則以后將無法設置元素。
另一方面,空結構struct{}
沒有字段,它不能保存任何值(除了struct{}
)。當您分配一個具有struct{}
其元素類型的切片時,不需要分配內存,因為您將無法在其中存儲任何需要內存的內容。所以不為這種類型分配內存是一個簡單而聰明的優化。
- 2 回答
- 0 關注
- 163 瀏覽
添加回答
舉報
0/150
提交
取消