使用反射把sql.Rows 中值填充到struct 中,從網上找了很多也沒有有效的優雅的方法,參考了gorm后,終於找到了,還是對指針了解不夠
package main
import (
"database/sql"
"fmt"
"reflect"
_ "github.com/go-sql-driver/mysql"
)
var db *sql.DB
type Test struct {
UserId int
UserName string
}
func main() {
db, _ = sql.Open("mysql", "uname:passwd@tcp(ip:port)/dbname?charset=utf8")
rows, err := db.Query("select user_id UserId,user_name UserName from test")
defer rows.Close()
if err != nil {
fmt.Println("sql open error ", err)
}
t := Test{}
columns, _ := rows.Columns()
values := make([]interface{}, len(columns))
reflectStruct := reflect.ValueOf(&t).Elem()
for i, v := range columns {
values[i] = reflectStruct.FieldByName(v).Addr().Interface()
}
for rows.Next() {
rows.Scan(values...)
}
fmt.Println(t)
}
