1 回答
TA贡献1876条经验 获得超6个赞
你想要的有几个糟糕的或至少有争议的设计决策。
1) 不能使用“WHERE ? = ?”的 SQL 语句。列名不能用 ? 代替,只有值可以。不是golang引起的,而是数据库引起的,因为在获取request的时候会创建一个如何获取数据的计划(使用哪个索引或者全表扫描……)。
这意味着您必须为每一列创建不同的查询字符串,您要在 where 子句中使用。它看起来像这样:
func GetUserInfoByColumn(field string) *User, error {
query := fmt.Sprintf("SELECT user_id, name, email FROM users WHERE %s = ?", column)
var u User
err := db.QueryRow(query, value).Scan(&u.User_id, &u.Name, &u.Email)
if err != nil {return nil, err}
return &u, nil
}
比这更有效的是使用闭包并在那里创建查询。
2) db.QueryRow 看起来是另一个问题。只有当您确定只有一行符合您的条件时,您才能使用它。如果您不太确定,请使用 db.Query。
3)在go中,您可以使用reflect来获取结构中所有项目的名称。但是如果你的结构只有很少的字段,那就太复杂了。在我们的例子中,您可以非常简单地创建所有必要的功能。
4)我不明白为什么你总是试图只填充结构的一个字段并将过滤器放入结构中。拥有更多功能并在适当的代码位置调用 UserInfoByName 或 UserInfoByEmail 不是更好吗?为什么你试图选择一个过滤器accoring字段?
- 1 回答
- 0 关注
- 182 浏览
添加回答
举报