我以为我会尝试一点点"聪明"并抽象我的一些样板SQL代码(使用sqlx - https://github.com/jmoiron/sqlx)。我们的想法是为代码提供一个函数指针来处理结果,以及生成行的sql字符串和args。实际上,只要我删除了" sqlArgs接口"东西,但在"聪明的"使用语句
格式化错误sql:转换Exec参数$ 1 type:unsupported type [] interface {},一个接口片
这是两个版本,第一个是错误,第二个是有效但没有参数化:
//GetRows (doesn't work)
func GetRows(parseRows func(*sqlx.Rows), sql string, sqlArgs ...interface{}) {
db := sqlx.MustConnect("mysql", ConnString)
defer db.Close()
rows, err := db.Queryx(sql, sqlArgs)
defer rows.Close()
if err != nil {
panic(err)
}
parseRows(rows)
}
//GetRows ... (works, but doesn't allow parameterization)
func GetRows(fp func(*sqlx.Rows), sql string) {
db := sqlx.MustConnect("mysql", ConnString)
defer db.Close()
rows, err := db.Queryx(sql)
defer rows.Close()
if err != nil {
panic(err)
}
fp(rows)
}
我们的想法是调用代码:
func getUser(userID string) User {
var users []*User
parseRows := func(rows *sqlx.Rows) {
for rows.Next() {
var u User
err := rows.StructScan(&u)
if err != nil {
panic(err)
}
users = append(users, u)
}
}
sql := "SELECT * FROM users WHERE userid = ?;"
sqlutils.GetRows(parseRows, sql, userID)
if len(users) == 1{
return users[0]
}
return User{}
}
我想我的代码实际上并没有从调用到调用传递userID,而是传递了一个[]接口{},而sql包无法处理。但是,我不确定。无论如何,有没有办法实现这个想法?感谢。