__Gorm__や__sqlx__のようなGolangのデータベースライブラリではプリミティブな機能である(*DB) Rows
と(*Rows) Scan
が使用できる。
(*Rows) Scan
の引数は大抵の場合structで紹介されているがinterface{}にScanした値をいれることができる。
以下がスニペット。
rows, err := sql.Rows()
var results []map[string]interface{}
cols, err := rows.Columns()
for rows.Next() {
var row = make([]interface{}, len(cols))
var rowp = make([]interface{}, len(cols))
for i := 0; i < len(cols); i++ {
rowp[i] = &row[i]
}
rows.Scan(rowp...)
rowMap := make(map[string]interface{})
for i, col := range cols {
switch row[i].(type) {
case []byte:
row[i] = string(row[i].([]byte))
num, err := strconv.Atoi(row[i].(string))
if err == nil {
row[i] = num
}
}
rowMap[col] = row[i]
}
results = append(results, rowMap)
}