私はSQLの結果を動的に構造化するために何かをしようとしていますが、基本的には行と構造体を渡して関数を実行して(データ型を取得して1つ作成する)アレイ。Golang構造体/インタフェース
誰でもどのようにすればいいですか?私はいけない
が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)が役立つと思います。 –
なぜ値を格納するための新しいインターフェイスをカスタムビルドすることを主張していますか?目的のタイプが何であるかを知らなくても行をスキャンするメソッドを用意したいだけですか?チェックする価値があるかもしれませんが、データベースにいくつかのメソッドを追加して、各フィールドを明示的にまたはスライスする代わりに構造体に直接スキャンできるようにします。これで、あなたのスキャン関数はインターフェイスを受け入れ、 'db.Select()'や 'db.Get()'に無意識に渡すだけでよいのです。 – Kaedys
ああ、まあ、ありがとう。 –