douhuan5073 2019-06-19 14:38
浏览 66
已采纳

如何在不使用字段名称作为字符串的情况下获取字段的标签?

Is it possible to fetch a field tag using a function that receives only the struct and the field itself ?

I know that I can do a thing like this:

reflect.TypeOf(x).FieldByName("FieldNameAsString").Tag

But I don't want to use the field's name as string in this case because it could be renamed in the future, so it is better to use the field itself instead.

type MyStruct struct {
    MyField string `thetag:"hello"`
}

func main() {
    x := MyStruct{}
    getTag(x, x.MyField)
}
  • 写回答

1条回答 默认 最新

  • dongtu1789 2019-06-19 16:12
    关注

    Use offsets to find the field:

    // getTag returns the tag for a field given a pointer to
    // a struct and a pointer to the field in that struct.
    func getTag(pv interface{}, pf interface{}) reflect.StructTag {
        v := reflect.ValueOf(pv)
        offset := reflect.ValueOf(pf).Pointer() - v.Pointer()
    
        t := v.Type().Elem()
        for i := 0; i < t.NumField(); i++ {
            f := t.Field(i)
            if f.Offset == offset {
                return f.Tag
            }
        }
        return ""
    }
    

    Run it on the playground.

    The code above assumes that the garbage collector does not move the struct between the to calls to Pointer. This assumption is true today, but may not true in the future. Use the unsafe package to make the code safe against future changes to the garbage collector:

    // getTag returns the tag for a field with the given offset
    // in the struct pointed to by pv.
    func getTag(pv interface{}, offset uintptr) reflect.StructTag {
        t := reflect.TypeOf(pv).Elem()
        for i := 0; i < t.NumField(); i++ {
            f := t.Field(i)
            if f.Offset == offset {
                return f.Tag
            }
        }
        return ""
    }
    

    Call it like this:

    x := MyStruct{}
    fmt.Println(getTag(&x, unsafe.Offsetof(x.MyField)))
    

    Run it on the Playground.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 PADS Logic 原理图
  • ¥15 PADS Logic 图标
  • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
  • ¥20 气象站点数据求取中~
  • ¥15 如何获取APP内弹出的网址链接
  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
  • ¥50 STM32单片机传感器读取错误
  • ¥15 (关键词-阻抗匹配,HFSS,RFID标签天线)
  • ¥15 机器人轨迹规划相关问题
  • ¥15 word样式右侧翻页键消失