Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 以GAE/Go获取结构的大小_Google App Engine_Memory_Go_Sizeof - Fatal编程技术网

Google app engine 以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中执行此操作?您建议的解决方案不是有效的代码,它有

我想用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