首页 > 学院 > 开发设计 > 正文

golang 获取一个结构体 struct 大小的代码

2019-11-08 20:07:45
字体:
来源:转载
供稿:网友

首先,结构体里不要有指向上一层的指针,否则会循环读取直至崩溃,后面会把这个问题修掉。仅限测试使用

下面上源代码

package sizestructimport ( "fmt" "reflect" "unsafe")func SizeStruct(data interface{}) int { return sizeof(reflect.ValueOf(data))}func sizeof(v reflect.Value) int { switch v.Kind() { case reflect.Map: sum := 0 keys := v.MapKeys() for i := 0; i < len(keys); i++ { mapkey := keys[i] s := sizeof(mapkey) if s < 0 { return -1 } sum += s s = sizeof(v.MapIndex(mapkey)) if s < 0 { return -1 } sum += s } return sum case reflect.Slice, reflect.Array: sum := 0 for i, n := 0, v.Len(); i < n; i++ { s := sizeof(v.Index(i)) if s < 0 { return -1 } sum += s } return sum case reflect.String: sum := 0 for i, n := 0, v.Len(); i < n; i++ { s := sizeof(v.Index(i)) if s < 0 { return -1 } sum += s } return sum case reflect.Ptr, reflect.Interface: p := (*[]byte)(unsafe.Pointer(v.Pointer())) if p == nil { return 0 } return sizeof(v.Elem()) case reflect.Struct: sum := 0 for i, n := 0, v.NumField(); i < n; i++ { s := sizeof(v.Field(i)) if s < 0 { return -1 } sum += s } return sum case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Float32, reflect.Float64, reflect.Complex64, reflect.Complex128, reflect.Int: return int(v.Type().Size()) default: fmt.PRintln("t.Kind() no found:", v.Kind()) } return -1}

github地址 https://github.com/Re-volution/sizestruct


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表