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

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

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-28 01:40:14530浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn