在 Go 中,有沒有一種使用反射的好方法,只需將字段包裝在反射庫中的函數(shù)中即可獲取字段標記?我基本上試圖創(chuàng)建一個瘦數(shù)據(jù)訪問對象,該對象允許在數(shù)據(jù)庫中獲取列名,而無需到處對其進行硬編碼。下面是將 db 列名稱作為標記的結(jié)構(gòu)。 // Table Structurestype 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"`}我正在尋找一個建議,而不是下載另一個關(guān)于如何使用反射的庫來進行這樣的調(diào)用以返回帶有標記值的字符串。var row CusipTableRowrow.GetColumnName(row.Id) //Return column name based on tag.我正在考慮可能嘗試使用map[地址]字段標簽,但由于沒有完全掌握不安全的軟件包,因此沒有運氣使其工作。如果這種方法可行,我想這樣的電話可能會起作用:row.GetColumnName(&row.Id) //Return column name based on tag.
1 回答

瀟瀟雨雨
TA貢獻1833條經(jīng)驗 獲得超4個贊
您可以在給定結(jié)構(gòu)的地址和字段的地址的情況下獲取字段標記。不需要不安全的惡作劇。
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
- 1 回答
- 0 關(guān)注
- 87 瀏覽
添加回答
舉報
0/150
提交
取消