罗杰已经展示了如何从不安全的软件包中使用SizeOf方法。在依赖于该函数返回的值之前,请确保已阅读以下内容:该大小不包括x可能引用的任何内存。例如,如果x是一个切片,则Sizeof返回切片描述符的大小,而不是该切片所引用的内存的大小。除此之外,我想解释一下如何使用几个简单的规则轻松计算任何结构的大小。然后如何使用有用的服务来验证您的直觉。大小取决于其组成的类型以及结构中字段的顺序(因为将使用不同的填充)。这意味着具有相同字段的两个结构可以具有不同的大小。例如,此结构的大小为32struct { a bool b string c bool}并稍作修改,其大小将为24(由于字段的顺序更紧凑,因此相差25%)struct { a bool c bool b string}从图片中可以看到,在第二个示例中,我们删除了一个填充,并移动了一个字段以利用先前的填充。路线可以是1、2、4或8。填充是用于填充变量以填充路线的空间(基本上是浪费的空间)。了解此规则并记住以下几点:bool,int8 / uint8占用1个字节int16,uint16-2个字节int32,uint32,float32-4个字节int64,uint64,float64,指针-8个字节字符串-16个字节(2个对齐方式为8个字节)任何条带占用24个字节(3个对齐8个字节)。因此[]bool,[][][]string都是一样的(不要忘记重新阅读我一开始添加的引文)长度数组n需要n*类型,它需要字节。有了填充,对齐和字节大小的知识,您可以快速弄清楚如何改善结构(但是使用该服务验证您的直觉还是有意义的)。
binary.TotalSize也是一个选项,但请注意,那和unsafe.Sizeof之间的行为略有不同:binary.TotalSize包括切片内容的大小,而unsafe.Sizeof仅返回顶级描述符的大小。这是一个如何使用TotalSize的示例。package mainimport ( "encoding/binary" "fmt" "reflect")type T struct { a uint32 b int8}func main() { var t T r := reflect.ValueOf(t) s := binary.TotalSize(r) fmt.Println(s)}