烙印99
结构体有固定的大小。如何初始化它们并不重要,它需要相同数量的内存。如果不为使用零值初始化的字段分配内存,则稍后分配值将需要分配内存。这是一个简单的基准代码来验证它:type T struct { i int s string x []int a [10]int64}var x *Tfunc BenchmarkZero(b *testing.B) { for i := 0; i < b.N; i++ { x = &T{} }}var xval = make([]int, 10)func BenchmarkNonZero(b *testing.B) { for i := 0; i < b.N; i++ { x = &T{ i: 10, s: "gopher", x: xval, a: [10]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, } }}使用 运行它go test -bench. -benchmem,输出是:BenchmarkZero-4 16268067 69.6 ns/op 128 B/op allocs/opBenchmarkNonZero-4 13961296 75.8 ns/op 128 B/op allocs/op和BenchmarkZero()都执行 128 字节的单个分配,这是(返回 128)BenchmarkNonZero()的大小。此大小基于 64 位架构:8 ( ) + 16(标头)+ 24(切片标头)+ 80(数组大小)。对于此结构,不需要隐式填充,因此这是其最终大小。Tunsafe.Sizeof(T{})intstring[10]int64在提供值时,我有目的地使用xval包级变量,T.x以避免必须在基准测试中为其分配值(并且不要弄乱基准测试的内容)。