gpt4 book ai didi

go - 如何在 Go 中获取包含数据结构的结构的大小?

转载 作者:IT王子 更新时间:2023-10-29 01:12:08 25 4
gpt4 key购买 nike

我目前正在尝试获取 Go 中复杂结构的大小。

我读过使用reflectunsafe 的解决方案,但是这些都不能帮助包含数组或映射(或任何其他指向底层数据结构)。

例子:

type testStruct struct {
A int
B string
C struct{}
items map[string]string
}

如果 items 中包含一些值,我如何找出上面的正确字节大小?

最佳答案

通过使用包 reflect,您可以非常接近结构及其内容所需的内存量。您需要遍历字段并获取每个字段的大小。例如:

func getSize(v interface{}) int {
size := int(reflect.TypeOf(v).Size())
switch reflect.TypeOf(v).Kind() {
case reflect.Slice:
s := reflect.ValueOf(v)
for i := 0; i < s.Len(); i++ {
size += getSize(s.Index(i).Interface())
}
case reflect.Map:
s := reflect.ValueOf(v)
keys := s.MapKeys()
size += int(float64(len(keys)) * 10.79) // approximation from https://golang.org/src/runtime/hashmap.go
for i := range(keys) {
size += getSize(keys[i].Interface()) + getSize(s.MapIndex(keys[i]).Interface())
}
case reflect.String:
size += reflect.ValueOf(v).Len()
case reflect.Struct:
s := reflect.ValueOf(v)
for i := 0; i < s.NumField(); i++ {
if s.Field(i).CanInterface() {
size += getSize(s.Field(i).Interface())
}
}
}
return size
}

这会使用 reflect 获取 v 的大小,然后,对于本例中支持的类型( slice 、映射、字符串和结构),它会计算存储在其中的内容所需的内存。您需要在此处添加您需要支持的其他类型。

有几个细节需要解决:

  1. 不计算私有(private)字段。
  2. 对于结构,我们重复计算基本类型。

对于第二个,您可以在处理结构时进行递归调用之前过滤掉它们,您可以在 reflect package 的文档中查看类型.

关于go - 如何在 Go 中获取包含数据结构的结构的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51431933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com