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 關注
- 205 瀏覽
添加回答
舉報