为了账号安全,请及时绑定邮箱和手机立即绑定

将值动态相加

将值动态相加

Go
喵喵时光机 2021-12-07 18:40:05
我正在尝试创建一个查看结构元数据的服务,并将找出要添加在一起的字段。这是一个示例 Struct 和我在 Go Playground 中用来添加东西的函数。这只是一个示例结构,显然并非所有字段都会递增。“恐慌:接口转换:接口是int,而不是int64”是恐慌,我该如何正确地做到这一点?package mainimport (   "fmt"   "reflect"   "strconv")type TestResult struct {    Complete         int        `json:"complete" increment:"true"`    Duration         int        `json:"duration" increment:"true"`    Failed           int        `json:"failed" increment:"true"`    Mistakes         int        `json:"mistakes" increment:"true"`    Points           int        `json:"points" increment:"true"`    Questions        int        `json:"questions" increment:"true"`    Removal_duration int        `json:"removal_duration" increment:"true"`}func main() {    old := TestResult{}    new := TestResult{}    old.Complete = 5    new.Complete = 10    values := reflect.ValueOf(old)    new_values := reflect.ValueOf(new)    value_type := reflect.TypeOf(old)    fmt.Println(values)    fmt.Println(new_values)    for i := 0; i < values.NumField(); i++ {       field := value_type.Field(i)       if increment, err := strconv.ParseBool(field.Tag.Get("increment")); err == nil && increment {          reflect.ValueOf(&new).Elem().Field(i).SetInt(new_values.Field(i).Interface().(int64) + values.Field(i).Interface().(int64))       }    }    fmt.Println(new)}游乐场:https : //play.golang.org/p/QghY01QY13
查看完整描述

1 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

因为这些字段的类型是int,所以您必须输入 assert to int

reflect.ValueOf(&new).Elem().Field(i).SetInt(int64(new_values.Field(i).Interface().(int) + values.Field(i).Interface().(int)))

另一种方法是使用Int()而不是 Interface().(int)。这种方法适用于所有有符号整数类型:

reflect.ValueOf(&new).Elem().Field(i).SetInt(new_values.Field(i).Int() + values.Field(i).Int())

以下是对所有数字类型执行此操作的方法:


        v := reflect.ValueOf(&new).Elem().Field(i)

        switch v.Kind() {

        case reflect.Int,

            reflect.Int8,

            reflect.Int16,

            reflect.Int32,

            reflect.Int64:

            v.SetInt(new_values.Field(i).Int() + values.Field(i).Int())

        case reflect.Uint,

            reflect.Uint8,

            reflect.Uint16,

            reflect.Uint32,

            reflect.Uint64:

            v.SetUint(new_values.Field(i).Uint() + values.Field(i).Uint())

        case reflect.Float32, reflect.Float64:

            v.SetFloat(new_values.Field(i).Float() + values.Field(i).Float())

        }


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 177 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信