我正在嘗試做一些事情來使SQL結果動態結構,基本上我想通過傳遞行和結構(獲取數據類型並創建一個)來運行函數,並返回接口陣列。Golang Structs/Interfaces
任何人都知道我該怎麼辦?
我不想通過直接的 「用戶」 結構作爲PARAM ..這不是動態
type User struct{
Id_user int `json:"id_user"`
Name string `json:"name"`
Email string `json:"email"`
Username string `json: "username"`
}
func main() {
var user User
rows, _ := db.Query("SELECT id_user, name, email, username FROM users")
json.NewEncoder(w).Encode(StructRow(user, rows))
}
func StructRow(u interface{}, rows *sql.Rows)[]interface{}{
var data []interface{}
for rows.Next() {
//How i can create a "user" here, dynamically
//for Example
//var user reflect.TypeOf(u)
_ = rows.Scan(StrutForScan(&user)...)
data = append(data, user)
}
return data
}
func StrutForScan(u interface{}) []interface{} {
val := reflect.ValueOf(u).Elem()
v := make([]interface{}, val.NumField())
for i := 0; i < val.NumField(); i++ {
valueField := val.Field(i)
v[i] = valueField.Addr().Interface()
}
return v
}
我認爲[ORM](https://github.com/jinzhu/gorm)可能會幫助你。 –
爲什麼你要堅持自定義構建一個存儲價值的新界面?難道你只是希望有一種方法可以掃描行而不必知道目標類型是什麼?值得一提的是[sqlx](https://github.com/jmoiron/sqlx),它爲數據庫添加了一些額外的方法,讓您直接掃描到結構中,而不必顯式提供每個字段或一個分片。因此,你的掃描函數只需要接受一個接口並將其盲目地傳遞給'db.Select()'或'db.Get()'。 – Kaedys
哦,好,謝謝。 –