如何创建通用函数来确定 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中文网其他相关文章!