我想在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中执行此操作?
答案 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?