Google app engine 以GAE/Go获取结构的大小
我想用GAE/Go获得结构的大小 我读了这篇文章,写了如下代码Google app engine 以GAE/Go获取结构的大小,google-app-engine,memory,go,sizeof,Google App Engine,Memory,Go,Sizeof,我想用GAE/Go获得结构的大小 我读了这篇文章,写了如下代码 import ( "reflect" "unsafe" ) func GetSize(T interface{}) { size := reflect.TypeOf(T).Size() return int((*int)(unsafe.Pointer(size))) } 但是,由于GAE不允许导入unsafe,因此此代码不起作用 如何在GAE/Go中执行此操作?您建议的解决方案不是有效的代码,它有
import (
"reflect"
"unsafe"
)
func GetSize(T interface{}) {
size := reflect.TypeOf(T).Size()
return int((*int)(unsafe.Pointer(size)))
}
但是,由于GAE不允许导入unsafe
,因此此代码不起作用
如何在GAE/Go中执行此操作?您建议的解决方案不是有效的代码,它有多个错误 例如,
GetSize()
没有结果类型,因此无法返回任何内容
接下来,返回的表达式也是语法错误,它试图将*int
指针转换为无效的int
您需要首先取消对指针的引用,因此正确的语法为:
func GetSize(T interface{}) int {
size := reflect.TypeOf(T).Size()
return int(*(*int)(unsafe.Pointer(size)))
}
但是。这毫无意义。已返回大小(存储给定类型的值所需的字节数),因此不需要使用safe
magic。可能令人困惑的是,它的返回类型是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{}))
输出(在上尝试):
有一件事你不能忘记:这个GetSize()
不会重复检查传递值的大小。例如,如果它是一个带有指针字段的结构,它不会“计算”指针值的大小,只计算指针字段的大小
由于像map
这样的类型,构造一个循环计算复杂数据结构总大小的GetSize()。有关详细信息,请参阅
Size of int: 4
Size of int64: 8
Size of [100]byte: 100