循环遍历结构体的字段,修改它们并返回结构体



我试图循环通过一个结构体的各个字段应用一个函数到每个字段,然后返回原始结构体作为一个整体与修改的字段值。显然,如果是针对一个结构体,这不会构成挑战,但我需要函数是动态的。对于本例,我引用了Post和Category结构体,如下所示

type Post struct{
    fieldName           data     `check:"value1"
    ...
}
type Post struct{
    fieldName           data     `check:"value2"
    ...
}

然后我有一个开关函数,它循环遍历结构体的各个字段,并根据check的值,对该字段的data应用一个函数,如下所示

type Datastore interface {
     ...
}
 func CheckSwitch(value reflect.Value){
    //this loops through the fields
    for i := 0; i < value.NumField(); i++ { // iterates through every struct type field
        tag := value.Type().Field(i).Tag // returns the tag string
        field := value.Field(i) // returns the content of the struct type field
        switch tag.Get("check"){
            case "value1":
                  fmt.Println(field.String())//or some other function
            case "value2":
                  fmt.Println(field.String())//or some other function
            ....
        }
        ///how could I modify the struct data during the switch seen above and then return the struct with the updated values?

}
}
//the check function is used i.e 
function foo(){ 
p:=Post{fieldName:"bar"} 
check(p)
}
func check(d Datastore){
     value := reflect.ValueOf(d) ///this gets the fields contained inside the struct
     CheckSwitch(value)
     ...
}   

本质上,我如何将CheckSwitch中switch语句之后修改的值重新插入到上面示例中接口指定的结构中?如果你还需要什么,请告诉我。由于

变量field的类型为reflect.Value。调用field上的Set*方法来设置结构体中的字段。例如:

 field.SetString("hello")

设置struct字段为"hello"。

如果要保留该结构体的值,必须传递一个指向该结构体的指针:

function foo(){ 
    p:=Post{fieldName:"bar"} 
    check(&p)
}
func check(d Datastore){
   value := reflect.ValueOf(d)
   if value.Kind() != reflect.Ptr {
      // error
   }
   CheckSwitch(value.Elem())
   ...
}

同时,字段名必须导出。

操场示例

相关内容

  • 没有找到相关文章

最新更新