go - 通用函数来获取 Go 中任何结构的大小

标签 go generics reflection

我正在编写一个通用函数来获取任何类型结构的大小,类似于 C 中的 sizeof 函数。

我正在尝试使用接口(interface)和反射来执行此操作,但我无法获得正确的结果。代码如下:

package main

import (
    "fmt"
    "reflect"
    "unsafe"
)

func main() {
    type myType struct {
        a int
        b int64
        c float32
        d float64
        e float64
    }
    info := myType{1, 2, 3.0, 4.0, 5.0}
    getSize(info)
}

func getSize(T interface{}) {
    v := reflect.ValueOf(T)
    const size = unsafe.Sizeof(v)
    fmt.Println(size)
}

此代码返回错误结果 12。我是 Go 的新手,请帮助我。

最佳答案

您获得的是 reflect.Value 结构的大小,而不是接口(interface) T 中包含的对象的大小。幸运的是,reflect.Type 有一个 Size() 方法:

size := reflect.TypeOf(T).Size()

这给了我 40,这是有道理的,因为有填充。

关于go - 通用函数来获取 Go 中任何结构的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31338588/

相关文章:

转到服务器 : get non-empty net. Conn

generics - 如何在 Julia 中指定无理数的类型?

php - Python:将 args 转换为 dict,就像 PHP 的 compact 一样?

ios - 有没有办法动态实例化类类型

c# - 如何调用基类中定义的私有(private) COM 接口(interface)的方法?

go - 从 PathError 中获取 errno 值的正确方法

json - 在 Go 中解码时如何识别无效值和未指定的字段?

http - GAE Go http 发布链接

c# - 如何测试类的实例是否为特定泛型类型?

java - 初始化 java 集合,将泛型留空,例如: HashMap<A, B> hM = HashMap<>();