反射获取字段标签

Arn*_* C. -1 reflection go

在 go 中有一种使用反射来获取字段标签的好方法,只需将字段包装在反射库中的函数中即可。

我基本上是在尝试创建一个瘦数据访问对象,它允许在数据库中获取列名,而无需到处进行硬编码。

下面是带有 db 列名称作为标签的结构。

    // Table Structures
type CusipTableRow struct {
    Id          int64  `db:"id"`
    Cusip       string `db:"cusip"`
    Symbol      string `db:"symbol"`
    Active      int8   `db:"active"`
    Added_Time  int32  `db:"added_timestamp"`
    Description string `db:"description"`
    Exchange    string `db:"exchange"`
    AssetType   string `db:"asset_type"`
}
Run Code Online (Sandbox Code Playgroud)

除了下载另一个关于如何使用反射本质上调用这样的库以返回带有标签值的字符串之外的任何建议。

var row CusipTableRow
row.GetColumnName(row.Id) //Return column name based on tag.
Run Code Online (Sandbox Code Playgroud)

我正在考虑可能尝试使用 map[address] fieldTag,但由于没有完全掌握 unsafe 包而没有运气让它起作用。如果这种方法行得通,我想这样的电话可能会奏效:

row.GetColumnName(&row.Id) //Return column name based on tag.
Run Code Online (Sandbox Code Playgroud)

任何想法和建议都会很棒。

谢谢

I L*_*ion 5

给定结构的地址和字段的地址,您可以获得字段标签。不需要不安全的恶作剧。

func GetColumnName(pstruct interface{}, pfield interface{}) string {
    v := reflect.ValueOf(pstruct).Elem()
    for i := 0; i < v.NumField(); i++ {
        if v.Field(i).Addr().Interface() == pfield {
            return v.Type().Field(i).Tag.Get("db")
        }
    }
    panic("field not in struct")
}
Run Code Online (Sandbox Code Playgroud)

使用示例:

var v CusipTableRow
fmt.Println(GetColumnName(&v, &v.Added_Time)) // prints added_timestamp
Run Code Online (Sandbox Code Playgroud)

在 Go Playground 上运行它