使用反射和循环修改结构值

我想遍历一个结构并使用反射修改字段值。如何设置?


func main() {

    x := struct {

        Foo string

        Bar int

    }{"foo", 2}

    StructCheck(Checker, x)

}


func Checker(s interface{}) interface{} {

    log.Println(s)

    return s

}


func StructCheck(check func(interface{}) interface{}, x interface{}) interface{} {

    v := reflect.ValueOf(x)

    for i := 0; i < v.NumField(); i++ {

        r := check(v.Field(i))

        w := reflect.ValueOf(&r).Elem()


        log.Println(w.Type(), w.CanSet())


        // v.Field(i).Set(reflect.ValueOf(w))


    }

    return v

}

运行 Set() 会导致紧急并显示 :reflect。值。使用不可寻址值进行设置


莫回无
浏览 60回答 1
1回答

MYYA

必须将可寻址值传递给函数。StructCheck(Checker, &x)有取消引用结构检查中的值:v := reflect.ValueOf(x).Elem() // Elem() gets value of ptr还有其他一些问题。以下是更新的代码:func StructCheck(check func(interface{}) interface{}, x interface{}) {&nbsp; &nbsp; v := reflect.ValueOf(x).Elem()&nbsp; &nbsp; for i := 0; i < v.NumField(); i++ {&nbsp; &nbsp; &nbsp; &nbsp; r := check(v.Field(i).Interface())&nbsp; &nbsp; &nbsp; &nbsp; v.Field(i).Set(reflect.ValueOf(r))&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go