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

时间:2017-06-14 06:08:36

标签: google-app-engine memory go sizeof

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

我阅读了this帖子并编写了如下代码。

import (
    "reflect"
    "unsafe"
)

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

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

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

1 个答案:

答案 0 :(得分:2)

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

例如GetSize()没有结果类型,因此您无法返回任何内容。

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

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

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

但是。这没有任何意义。 reflect.Type.Size()已经返回了大小(存储给定类型值所需的字节数),因此不需要unsafe魔法。可能令人困惑的是它的返回类型为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()不会重新检查传递值的大小。因此,例如,如果它是一个带有指针字段的结构,它将不会“计算”指向值的大小,只计算指针字段的大小。

由于像GetSize()这样的类型,构造一个可以重新计算复杂数据结构总大小的map是非平凡的。有关详细信息,请参阅How to get variable memory size of variable in golang?