Go 动态地将值添加到一起
我正在尝试创建一个服务,它查看结构元数据,并确定要将哪些字段添加到一起。这是一个示例结构和我在Go Playerly中用来添加东西的函数。这只是一个示例结构,显然不是所有字段都是递增的 “panic:interface conversion:interface是int,而不是int64”是panic,我该如何正确地实现这一点Go 动态地将值添加到一起,go,Go,我正在尝试创建一个服务,它查看结构元数据,并确定要将哪些字段添加到一起。这是一个示例结构和我在Go Playerly中用来添加东西的函数。这只是一个示例结构,显然不是所有字段都是递增的 “panic:interface conversion:interface是int,而不是int64”是panic,我该如何正确地实现这一点 package main import ( "fmt" "reflect" "strconv" ) type TestResult struct {
package main
import (
"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)
}
主程序包
进口(
“fmt”
“反映”
“strconv”
)
类型TestResult结构{
Complete int`json:“Complete”增量:“true”`
Duration int`json:“Duration”增量:“true”`
Failed int`json:“Failed”增量:“true”`
errors int`json:“errors”增量:“true”`
Points int`json:“Points”增量:“true”`
Questions int`json:“Questions”增量:“true”`
删除持续时间int`json:“删除持续时间”增量:“真”`
}
func main(){
旧:=测试结果{}
新:=TestResult{}
旧的。完整的=5
新建。完成=10
值:=reflect.ValueOf(旧)
新值:=reflect.ValueOf(新)
值类型:=reflect.TypeOf(旧)
fmt.Println(值)
fmt.Println(新值)
对于i:=0;i
操场:由于字段的类型为
int
,因此必须将assert键入int
reflect.ValueOf(&new).Elem().Field(i).SetInt(int64(new_values.Field(i).Interface().(int) + values.Field(i).Interface().(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())
}
为什么不呢?有没有办法让它更具活力?像任何类型的int/float一样?谢谢,这正是我想要的。