Golang中函数仅在if条件中调用而else不调用?有没有更好的调用方式?
Golang中函数仅在if条件中调用而else不调用?有没有更好的调用方式? 如何调用这个函数 所有代码都正常。只是不明白如何在那里调用这个函数 因为没有正确调用这个 Find_User 函数到 Login 中,电子邮件身份验证没有发生。 请告诉我
func Find_User(user *model.User) (model.User, error) {
filter := bson.M{"email": user.Email}
result := model.User{}
err := clientInstance.Database(AUTH_DB).Collection(USER_COLLECTION).FindOne(context.Background(), filter).Decode(&result)
if err != nil {
if errors.Is(err, mongo.ErrNoDocuments) {
return model.User{}, nil
}
return model.User{}, fmt.Errorf("finding user:%w", err)
}
return result, nil
}
登录函数
func Login_User(user *model.User) (interface{}, error) {
if result, err := util.Find_User(user); err == nil {
return result, err
} else {
return nil, err
}
}
在这里
func Login(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
var user model.User
var dbuser model.User
if err := json.NewDecoder(r.Body).Decode(&user); err == nil {
//下面我调用了函数
if _, err := service.Login_User(&user); err == nil {
w.Write([]byte(`{"response":"Login success"}`))
} else {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(`{"response":Login Failed}`))
return
}
} else {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
userPass := []byte(user.Password)
dbPass := []byte(dbuser.Password)
passErr := bcrypt.CompareHashAndPassword(dbPass, userPass)
if passErr != nil {
w.Write([]byte(`{"response":"Wrong Password!"}`))
return
}
}
更多关于Golang中函数仅在if条件中调用而else不调用?有没有更好的调用方式?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
2 回复
你好!
首先,你可以减少 if 语句的数量。
if err := json.NewDecoder(r.Body).Decode(&user); err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
更多关于Golang中函数仅在if条件中调用而else不调用?有没有更好的调用方式?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
从代码分析,主要问题在于Login_User函数的调用方式和逻辑处理不当。以下是具体问题和改进方案:
问题分析
Find_User函数逻辑问题:当查询到用户不存在时返回空用户且err=nil,这会导致调用方无法区分"用户不存在"和"查询成功但用户为空"的情况Login_User函数逻辑错误:仅在if分支调用函数,else分支返回错误,但实际应该统一处理- 登录流程不完整:密码验证逻辑与用户查询分离
改进后的代码
1. 修改Find_User函数,明确区分错误情况
func Find_User(email string) (model.User, error) {
filter := bson.M{"email": email}
result := model.User{}
err := clientInstance.Database(AUTH_DB).Collection(USER_COLLECTION).
FindOne(context.Background(), filter).Decode(&result)
if err != nil {
if errors.Is(err, mongo.ErrNoDocuments) {
// 明确返回错误,而不是空用户
return model.User{}, fmt.Errorf("user not found with email: %s", email)
}
return model.User{}, fmt.Errorf("database error: %w", err)
}
return result, nil
}
2. 重构Login_User函数,统一处理逻辑
func Login_User(email, password string) (model.User, error) {
// 查找用户
dbUser, err := Find_User(email)
if err != nil {
return model.User{}, fmt.Errorf("login failed: %w", err)
}
// 验证密码
err = bcrypt.CompareHashAndPassword([]byte(dbUser.Password), []byte(password))
if err != nil {
return model.User{}, fmt.Errorf("invalid password: %w", err)
}
return dbUser, nil
}
3. 修改Login处理函数
func Login(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
var loginReq struct {
Email string `json:"email"`
Password string `json:"password"`
}
// 解析请求体
if err := json.NewDecoder(r.Body).Decode(&loginReq); err != nil {
http.Error(w, `{"error":"invalid request"}`, http.StatusBadRequest)
return
}
// 调用登录服务
user, err := service.Login_User(loginReq.Email, loginReq.Password)
if err != nil {
w.WriteHeader(http.StatusUnauthorized)
w.Write([]byte(`{"error":"` + err.Error() + `"}`))
return
}
// 登录成功
response := map[string]interface{}{
"response": "Login success",
"user": user.Email,
"user_id": user.ID,
}
json.NewEncoder(w).Encode(response)
}
关键改进点
- 函数职责分离:
Find_User只负责查询,Login_User处理完整的登录逻辑 - 错误处理明确:使用明确的错误信息区分不同失败情况
- 简化调用逻辑:避免复杂的
if-else嵌套,使用直接调用方式 - 完整登录流程:将用户查询和密码验证整合在一个函数中
这样修改后,调用方式更清晰,错误处理更完善,且避免了原代码中if条件调用而else不调用的不一致问题。

