在 GAE/Go 中获取结构的大小

Getting size of a structure in GAE/Go

我想获取 GAE/Go 中结构的大小。

我阅读了post并编写了如下代码。

import (
    "reflect"
    "unsafe"
)

func GetSize(T interface{}) {
    size := reflect.TypeOf(T).Size()
    return int((*int)(unsafe.Pointer(size)))
}

但是这段代码不起作用,因为 GAE 不允许导入 unsafe

如何在 GAE/Go 中执行此操作?

您提出的解决方案不是有效代码,它有多个错误。

例如 GetSize() 没有结果类型,所以你不能 return 任何东西。

接下来,您 return 的表达式也是语法错误,它试图将 *int 指针转换为无效的 int

您需要先取消引用指针,因此正确的语法是:

func GetSize(T interface{}) int {
    size := reflect.TypeOf(T).Size()
    return int(*(*int)(unsafe.Pointer(size)))
}

但是。没有意义。 reflect.Type.Size() 已经 return 大小(存储给定类型的值所需的字节数),因此不需要 unsafe 魔法。可能令人困惑的是它的 return 类型是 uintptr,但您可以简单地在将其转换为 int 之后使用该值。例如

只需使用:

func GetSize(v interface{}) int {
    return int(reflect.TypeOf(v).Size())
}

正在测试:

fmt.Println("Size of int:", GetSize(int(0)))
fmt.Println("Size of int64:", GetSize(int64(0)))
fmt.Println("Size of [100]byte:", GetSize([100]byte{}))

输出(在 Go Playground 上尝试):

Size of int: 4
Size of int64: 8
Size of [100]byte: 100

有一件事你不能忘记:这个GetSize() 不会递归地检查传递值的大小。因此,例如,如果它是一个带有指针字段的结构,它不会 "count" 指向值的大小,只有指针字段的大小。

由于像 map 这样的类型,构建递归计算复杂数据结构的总大小的 GetSize() 并不简单。详情见