unsafe.SizeOf()reflect.Type.Size()
reflect.SliceHeader
s := make([]int32, 1000) 

fmt.Println("Size of []int32:", unsafe.Sizeof(s)) 
fmt.Println("Size of [1000]int32:", unsafe.Sizeof([1000]int32{})) 
fmt.Println("Real size of s:", unsafe.Sizeof(s)+unsafe.Sizeof([1000]int32{})) 

输出(尝试在Go Playground ):

Size of []int32: 12 
Size of [1000]int32: 4000 
Real size of s: 4012 

地图有很多更复杂的数据结构,我就不赘述了,但检查出这个问题的答案+:Golang: computing the memory footprint (or byte length) of a map

-benchmemgetSlice()getMap()
func BenchmarkSlice100(b *testing.B) { 
    for i := 0; i < b.N; i++ { getSlice(100) } 
} 
func BenchmarkSlice1000(b *testing.B) { 
    for i := 0; i < b.N; i++ { getSlice(1000) } 
} 
func BenchmarkSlice10000(b *testing.B) { 
    for i := 0; i < b.N; i++ { getSlice(10000) } 
} 
func BenchmarkMap100(b *testing.B) { 
    for i := 0; i < b.N; i++ { getMap(100) } 
} 
func BenchmarkMap1000(b *testing.B) { 
    for i := 0; i < b.N; i++ { getMap(1000) } 
} 
func BenchmarkMap10000(b *testing.B) { 
    for i := 0; i < b.N; i++ { getMap(10000) } 
} 

运行
go test -bench . -benchmem 

输出是:

BenchmarkSlice100-4 3000000  471 ns/op  1792 B/op  1 allocs/op 
BenchmarkSlice1000-4 300000  3944 ns/op  16384 B/op  1 allocs/op 
BenchmarkSlice10000-4 50000  39293 ns/op  163840 B/op  1 allocs/op 
BenchmarkMap100-4  200000  11651 ns/op  2843 B/op  9 allocs/op 
BenchmarkMap1000-4  10000  111040 ns/op  41823 B/op  12 allocs/op 
BenchmarkMap10000-4  1000 1152011 ns/op  315450 B/op 135 allocs/op 
B/opallocs/op
int