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

无法使用 Golang 中的反射将 xml 解构到动态创建的结构中

无法使用 Golang 中的反射将 xml 解构到动态创建的结构中

Go
慕侠2389804 2022-09-05 09:20:38
这是我用于解析 xml 的代码。在函数的末尾,我应该在值切片中具有结构的字段值。func FindAttrs(attrs []Tag, errorChan chan<- error) {    var tableFields []reflect.StructField    for _, v := range attrs {        tableFields = append(tableFields, reflect.StructField{            Name:      strings.Title(v.Name),            Type:      reflect.TypeOf(""),            Tag:       reflect.StructTag(fmt.Sprintf(`xml:"%v,attr"`, v.Name)),            Offset:    0,            PkgPath:   "utility",            Index:     nil,            Anonymous: false,        })    }    unmarshalStruct := reflect.Zero(reflect.StructOf(tableFields))    err := xml.Unmarshal(ReadBytes(errorChan), &unmarshalStruct)    HandleError(err, "Error parse config", false, errorChan)    values := make([]interface{}, unmarshalStruct.NumField())    for i := 0; i < unmarshalStruct.NumField(); i++ {        values[i] = unmarshalStruct.Field(0).Interface()    }}但是,它会惊慌失措地显示以下消息:reflect.Value.Interface: cannot return value obtained from unexported field or method我称之为:utility.FindAttrs([]utility.Tag{        {"name", reflect.String}, {"isUsed", reflect.String},    }, errorChan)我的xml是<configuration name="mur" isUsed="mur"/>
查看完整描述

1 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

需要制作一个指向结构的指针而不是一个值,并将指针的值(可以通过检索到的函数)传递给Unmarshal而不是它本身。Interface()


var tableFields []reflect.StructField

    for _, v := range attrs {

        tableFields = append(tableFields, reflect.StructField{

            Name: strings.Title(v.Name),

            Type: reflect.TypeOf(""),

            Tag:  reflect.StructTag(fmt.Sprintf(`xml:"%v,attr"`, v.Name)),

        })

    }


    rv := reflect.New(reflect.StructOf(tableFields)) // initialize a pointer to the struct


    v := rv.Interface() // get the actual value

    err := xml.Unmarshal([]byte(`<configuration name="foo" isUsed="bar"/>`), v)

    if err != nil {

        panic(err)

    }


    rv = rv.Elem() // dereference the pointer

    values := make([]interface{}, rv.NumField())

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

        values[i] = rv.Field(i).Interface()

    }


查看完整回答
反对 回复 2022-09-05
  • 1 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

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