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