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函数的调用方式和逻辑处理不当。以下是具体问题和改进方案:

问题分析

  1. Find_User函数逻辑问题:当查询到用户不存在时返回空用户且err=nil,这会导致调用方无法区分"用户不存在"和"查询成功但用户为空"的情况
  2. Login_User函数逻辑错误:仅在if分支调用函数,else分支返回错误,但实际应该统一处理
  3. 登录流程不完整:密码验证逻辑与用户查询分离

改进后的代码

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)
}

关键改进点

  1. 函数职责分离Find_User只负责查询,Login_User处理完整的登录逻辑
  2. 错误处理明确:使用明确的错误信息区分不同失败情况
  3. 简化调用逻辑:避免复杂的if-else嵌套,使用直接调用方式
  4. 完整登录流程:将用户查询和密码验证整合在一个函数中

这样修改后,调用方式更清晰,错误处理更完善,且避免了原代码中if条件调用而else不调用的不一致问题。

回到顶部