Slide 18
Slide 18 text
func (db *DB) Select(dest interface{}, query string, args ...interface{}) error {
return Select(db, dest, query, args...)
}
func Select(q Queryer, dest interface{}, query string, args ...interface{}) error {
rows, err := q.Queryx(query, args...)
// ...
return scanAll(rows, dest, false)
}
func scanAll(rows rowsi, dest interface{}, structOnly bool) error {
// destの種別判定や、reflectでゴニョゴニョ頑張っている処理
// ...
for rows.Next() {
// destが構造体のsliceの場合、valuesは構造体の各フィールド([]interface{}型)
err = rows.Scan(values...)
// ...
}
}
sqlxパッケージが構造体に値を入れている仕組みを見てみる
github.com/jmoiron/sqlx