我正在尝试为 golang 构建一个简单的 orm 层。这将采用一个结构并生成cols []然后可以将其传递给 sql 函数 rows.Scan(cols...),该函数采用与它在结果集中找到的每个列相对应的结构中的字段指针
这是我的示例结构
type ExampleStruct struct {
ID int64 `sql:"id"`
aID string `sql:"a_id"`
UserID int64 `sql:"user_id"`
这是我的通用 ORM 函数
func GetSqlColumnToFieldMap(model *ExampleStruct) map[string]interface{} {
typeOfModel := reflect.TypeOf(*model)
ValueOfModel := reflect.ValueOf(*model)
columnToDataPointerMap := make(map[string]interface{})
for i := 0; i < ValueOfModel.NumField(); i++ {
sql_column := typeOfModel.Field(i).Tag.Get("sql")
structValue := ValueOfModel.Field(i)
columnToDataPointerMap[sql_column] = structValue.Addr()
}
return columnToDataPointerMap
}
一旦这个方法工作正常,我就可以使用它生成的映射根据我在 rows() 对象中获得的 column_names 创建一个有序的 sql 指针列表但是我在方法调用中遇到以下.Addr()错误
panic: reflect.Value.Addr of unaddressable value [recovered]
panic: reflect.Value.Addr of unaddressable value
不可能这样做吗?同样在理想情况下,我希望该方法采用接口而不是 *ExampleStruct,以便它可以在不同的数据库模型中重用。
米脂
相关分类