go - 获取Go中分层结构的所有标签

标签 go

我想将我的休息回复中的一些字段从英语翻译成印地语。我有几个翻译文件,其中我有从英语到印地语的单词映射。我想通过字段标签提供的文件的名称。
所以我的结构看起来像这样

    type myResponse struct {
        City string `translatorFile:"CityEToH"`
        State string `translatorFile:"StateEToH"`
        StationCode []string `translatorFile:"StationCodeEToH"`
        InsideStruct insideStruct
    }

    type insideStruct struct {
        trainName string `translatorFile:"TrainEToH"`
        StartingPoint string `translatorFile:"StationCodeEToH"`
        FinishPoint string `translatorFile:"StationCodeEToH"`
    }

我想编写一个通用的翻译方法,它将 interface{} 作为输入参数,并将返回一个接口(interface)(在转换输入之后)作为输出。我刚刚开始学习 Go 并且我坚持执行。我无法创建将 fieldName 映射到相应的翻译文件名称的映射类型的结构。

我已经尝试过 reflect.typeOf(input),但是我无法获得 insideStruct 的标签。这只是有效载荷的一个示例结构,我也可以有 4-5 个继承级别的结构。

有没有办法将 fieldName、tags 和 fieldValue 放在一起。或者有没有其他更好的方法来实现这个?

最佳答案

这是一个遍历值并为每个带有关联结构标记的字符串调用一个函数的函数:

func walkStrings(v reflect.Value, tag reflect.StructTag, fn func(reflect.Value, reflect.StructTag)) {
    v = reflect.Indirect(v)
    switch v.Kind() {
    case reflect.Struct:
        t := v.Type()
        for i := 0; i < t.NumField(); i++ {
            walkStrings(v.Field(i), t.Field(i).Tag, fn)
        }
    case reflect.Slice, reflect.Array:
        if v.Type().Elem().Kind() == reflect.String {
            for i := 0; i < v.Len(); i++ {
                walkStrings(v.Index(i), tag, fn)
            }
        }
    case reflect.String:
        fn(v, tag)
    }
}

函数fn可以使用Value.String将值作为字符串和 Value.SetString更改值。使用StructTag.Get获取标签。一个示例函数是:
func translate(v reflect.Value, tag reflect.StructTag) {
    if !v.CanSet() {
        // unexported fields cannot be set
        return
    }
    file := tag.Get("translatorFile")
    if file == "" {
        return
    }
    v.SetString(translatStringWithFile(v.String(), file)
}

调用 walkStrings使用结构指针的 reflect.Value 和空字符串作为标记:
v := myResponse{
    City:         "mycity",
    StationCode:  []string{"code1", "code2"},
    InsideStruct: insideStruct{"trainname", "start", "finish"},
}
walkStrings(reflect.ValueOf(&v), "", translate)

Run it on the playground .

关于go - 获取Go中分层结构的所有标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59558686/

相关文章:

arrays - 迭代时更改值

go - 无法访问 Golang 中的登录页面

go - 如何在 Golang 中检索经过身份验证的用户

cookies - 使用 net/http 设置 cookie

amazon-web-services - 如何获取 AWS 凭证并访问 Docker 上的 S3

http.Redirect() 带标题

go - 重新连接时丢弃消息的可重新连接的 websocket

unit-testing - 如何测试CLI标志-当前因“标志重新定义”而失败

mongodb - mgo 中的关系

google-app-engine - 是否可以在没有 http 请求的情况下访问 GAE 数据存储?