在golang反射中如何忽略字段名大小写

4

我正在尝试使用反射从golang中的结构体中读取数据,我已经成功地完成了这个任务,但是我想知道如何忽略字段名称的大小写。

以下是我的代码:

type App struct{
    AppID        string
    Owner        string
    DisplayName  string
}

func Extract(app *App){
appData := reflect.ValueOf(app)
appid := reflect.Indirect(appData).FieldByName("appid")
fmt.Println(appid.String())
owner:=reflect.Indirect(appData).FieldByName("owner")
fmt.Println(owner.String())
}

上述函数返回<invalid-value>,这是由于字段名称的小写造成的。
有没有办法忽略大小写?

2
我认为不会,因为您可以在结构体中具有不同大小写的相同名称的不同字段。 - robert
据我所知,Golang也不支持属性别名。 - Peter S
1个回答

6
使用Value.FieldByNameFuncstrings.ToLower来忽略大小写查找字段:
func caseInsenstiveFieldByName(v reflect.Value, name string) reflect.Value {
    name = strings.ToLower(name)
    return v.FieldByNameFunc(func(n string) bool { return strings.ToLower(n) == name })
}

像这样使用:

func Extract(app *App) {
    appData := reflect.ValueOf(app)
    appid := caseInsenstiveFieldByName(reflect.Indirect(appData), "appid")
    fmt.Println(appid.String())
    owner := caseInsenstiveFieldByName(reflect.Indirect(appData), "owner")
    fmt.Println(owner.String())
}

在Playground上运行它


另外,现在您可以使用 strings.EqualFold 函数。 - Max Maximov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接