1 回答

TA貢獻1836條經驗 獲得超3個贊
該錯誤表明您想要獲取其地址的值是不可尋址的。這是因為即使您將指針傳遞給GetSqlColumnToFieldMap(),您也會立即取消引用它并稍后使用非指針值。
這個值被包裝在一個interface{}when passed to中reflect.ValueOf(),并且包裝在接口中的值是不可尋址的。
您不能取消引用指針,而是使用Type.Elem()andValue.Elem()獲取元素類型和指向的值。
是這樣的:
func GetSqlColumnToFieldMap(model *ExampleStruct) map[string]interface{} {
t := reflect.TypeOf(model).Elem()
v := reflect.ValueOf(model).Elem()
columnToDataPointerMap := make(map[string]interface{})
for i := 0; i < v.NumField(); i++ {
sql_column := t.Field(i).Tag.Get("sql")
structValue := v.Field(i)
columnToDataPointerMap[sql_column] = structValue.Addr()
}
return columnToDataPointerMap
}
通過這個簡單的更改,它就起作用了!而且它不依賴于參數類型,您可以將其更改為interface{}并傳遞任何結構指針。
func GetSqlColumnToFieldMap(model interface{}) map[string]interface{} {
// ...
}
測試它:
type ExampleStruct struct {
ID int64 `sql:"id"`
AID string `sql:"a_id"`
UserID int64 `sql:"user_id"`
}
type Point struct {
X int `sql:"x"`
Y int `sql:"y"`
}
func main() {
fmt.Println(GetSqlColumnToFieldMap(&ExampleStruct{}))
fmt.Println(GetSqlColumnToFieldMap(&Point{}))
}
輸出(在Go Playground上嘗試):
map[a_id:<*string Value> id:<*int64 Value> user_id:<*int64 Value>]
map[x:<*int Value> y:<*int Value>]
請注意,Value.Addr()返回包含在reflect.Value. 要“展開”指針,請使用Value.Interface():
func GetSqlColumnToFieldMap(model interface{}) map[string]interface{} {
t := reflect.TypeOf(model).Elem()
v := reflect.ValueOf(model).Elem()
m := make(map[string]interface{})
for i := 0; i < v.NumField(); i++ {
colName := t.Field(i).Tag.Get("sql")
field := v.Field(i)
m[colName] = field.Addr().Interface()
}
return m
}
這將輸出(在Go Playground上嘗試):
map[a_id:0xc00007e008 id:0xc00007e000 user_id:0xc00007e018]
map[x:0xc000018060 y:0xc000018068]
- 1 回答
- 0 關注
- 80 瀏覽
添加回答
舉報