我想我会尝试变得有点“聪明”并抽象一些我的样板 SQL 代码(使用 sqlx - https://github.com/jmoiron/sqlx)。这个想法是为代码提供一个函数指针来处理结果,以及产生行的 sql 字符串和 args。碰巧的是,只要我去掉“sqlArgs 接口”的东西,代码就可以正常工作,但是语句的“聪明”格式错误
sql:转换Exec参数$1类型:不支持类型[]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{}
}
我想我的代码实际上并没有通过调用传递用户 ID,而是传递了一个 []interface{},而 sql 包无法处理。不过,我不确定。无论如何,有没有办法实现这个想法?谢谢。