首页 > 后端开发 > Golang > 如何使用反射获取 Go 中任何结构的大小?

如何使用反射获取 Go 中任何结构的大小?

Mary-Kate Olsen
发布: 2024-11-28 01:40:14
原创
477 人浏览过

How Can I Get the Size of Any Structure in Go Using Reflection?

Go 中获取任意结构大小的通用函数

问题:
目标是创建Go 中的通用函数,可以确定任意结构的大小,类似于 Go 中的 sizeof 函数C.

代码和错误:
提供的代码使用反射来检索结构的大小。但是,反映reflect.Value 结构而不是反映对象会产生不正确的结果。这是有问题的代码:

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) // Prints 12, which is incorrect
}
登录后复制

解决方案:
要解决此问题,需要反映对象的类型而不是值。 Reflect.Type 有一个 Size() 方法,可以提供正确的大小。这是更新后的代码:

package main

import (
    "fmt"
    "reflect"
)

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)
    size := v.Type().Size()
    fmt.Println(size) // Prints 40, which is correct
}
登录后复制

说明:
更正后的代码使用reflect.Type的Size()方法,该方法返回结构的大小,而无需反射开销.

以上是如何使用反射获取 Go 中任何结构的大小?的详细内容。更多信息请关注PHP中文网其他相关文章!

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