-2

在 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"`
}

我正在寻求一个建议,而不是下载另一个关于如何使用反射来本质上进行这样的调用以返回带有标签值的字符串的库。

var row CusipTableRow
row.GetColumnName(row.Id) //Return column name based on tag.

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

row.GetColumnName(&row.Id) //Return column name based on tag.
4

1 回答 1

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")
}

示例使用:

var v CusipTableRow
fmt.Println(GetColumnName(&v, &v.Added_Time)) // prints added_timestamp

在 Go Playground 上运行它

于 2021-09-03T16:54:52.377 回答