首页 > 后端开发 > Golang > 正文

我如何一般性地确定任何 Go 结构的大小?

DDD
发布: 2024-11-26 07:58:08
原创
801 人浏览过

How Can I Generically Determine the Size of Any Go Structure?

如何创建通用函数来确定 Go 中任何结构的大小

编程中经常执行的任务之一是确定结构的大小。在 Go 中,这可以使用 unsafe.Sizeof 函数来实现。然而,创建一个可以处理任何类型结构的泛型函数有点具有挑战性。

问题

创建泛型函数的常见方法是使用接口和反思。但是,使用如下所示的方法会产生不正确的结果:

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,因为它确定 Reflect.Value 结构的大小,而不是存储在接口中的实际结构的大小.

解决方案

要解决此问题,请使用reflect.Type 而不是reflect.Value来获取尺寸信息。 Reflect.Type 类型有一个 Size() 方法,它返回相应类型的大小:

size := reflect.TypeOf(T).Size()
登录后复制

使用这种方法,代码提供了正确的结果 40,考虑了结构内的填充。

以上是我如何一般性地确定任何 Go 结构的大小?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板