亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

golang從結構返回第一個字段

golang從結構返回第一個字段

Go
慕容708150 2021-11-15 16:58:51
我試圖返回給定一個屬性的所有用戶信息,該屬性可以是 user_id、電子郵件或名稱。u := User{ Email: "[email protected]" })k := User {Name: "john"}ReturnUserInfo(u)ReturnUserInfo(k)我調用傳遞一個只有一個字段的 User 結構的函數。然后我想在不明確說出電子郵件的情況下解析該字段。最后,我通過傳遞一個隱式字段(user_id 或 email 等)來獲取用戶信息func ReturnUserInfo(u User) (y User){    // Retrieve first field from u and set them to field and value.    // NOT explicitly stating field := email, value := u.Email    db, _ := sql.Open("mysql", "root:password@/users")    _ := db.QueryRow("SELECT user_id, name, email FROM users WHERE ? = ?", field, value).Scan(        &u.User_id, &u.Name, &u.Email)    y = User{        User_id: u.User_id,        Name: u.Name,        Email: u.Email,    }    return y}我不確定我是否能夠在 Golang 中執行此操作,但我正在創建此函數,因此我不必明確告訴 Go 查找特定屬性以返回用戶信息。
查看完整描述

1 回答

?
HUX布斯

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字段?


查看完整回答
反對 回復 2021-11-15
  • 1 回答
  • 0 關注
  • 205 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號