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