0
我正在嘗試改進處理登錄的Go應用程序中的一段代碼。它會收到一個login
值和password
值,然後檢查數據庫中的username
字段或email
字段以查看是否可以找到用戶。如果login
包含@
符號,則將使用電子郵件。用用戶名或電子郵件地址登錄
所以我目前有:
if strings.Contains(login, "@") {
err := collection("users").Find(bson.M{"email" : login}).One(&user)
if err != nil { //no user found
api.WriteError(w, 400, "USER_NOT_FOUND", "No user found with email address: " + login)
return
}
} else {
err := collection("users").Find(bson.M{"username" : login}).One(&user)
if err != nil { //no user found
api.WriteError(w, 400, "USER_NOT_FOUND", "No user found with username: " + login)
return
}
}
//go on and check password
但你可以看到,因爲我必須處理同樣的錯誤兩次,這不是很有效。我也試過:
if strings.Contains(login.Identifier, "@") {
err := collection("users").Find(bson.M{}).One(&user)
} else {
err := collection("users").Find(bson.M{"username" : login}).One(&user)
}
if err != nil { //no user found
api.WriteError(w, 400, "USER_NOT_FOUND", "No user found with email address: " + login)
return
}
//go on and check password
但是err
並不總是存在。
我想過讓{"username" : login}
零件成爲一個字符串變量,但我似乎無法得到這個工作。
'ERR:= ...'創建一個新的'err'可變局部範圍,它從陰影更遠的範圍的任何'err'變量和新變量消失在當前的端'{}'塊。你可以在'if'之前加'var err error'並在'if'體內使用'err = ...'。 –