Go语言实战案例-模拟登录验证(用户名密码)

在《Go语言100个实战案例》中 案例9:模拟登录验证(用户名密码) 的完整内容,旨在帮助初学者理解如何实现用户身份验证,掌握字符串处理和条件判断的运用。


案例9:模拟登录验证(用户名密码)

🔐 安全性与交互 | 💻 基本的用户身份验证 | 👶 初学者友好


一、📘 案例目标

本案例将模拟一个简单的登录系统。用户输入用户名与密码,程序验证用户输入的正确性,并反馈登录是否成功。通过本案例,学习如何处理字符串、条件判断以及基本的输入输出操作。


二、🔍 应用场景举例

  • • 用户系统登录:用户名与密码验证
  • • 系统权限管理:用户验证并授权访问
  • • 基本的身份验证系统模拟

三、🔑 涉及知识点

知识点 说明
字符串操作 比较输入的用户名和密码
if 条件判断 判断用户输入的用户名和密码是否匹配
bufio 包使用 用于获取用户输入,避免空格导致的问题
用户交互 提示用户输入并进行反馈

四、🛠 功能需求

    1. 用户输入用户名和密码;
    1. 程序检查输入的用户名和密码是否与预设的匹配;
    1. 如果匹配,提示登录成功;如果不匹配,提示登录失败;
    1. 限制输入次数(如3次错误就退出)。

五、✅ 完整代码实现

go 复制代码
package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

func main() {
    // 预设的用户名与密码
    const correctUsername = "admin"
    const correctPassword = "123456"

    // 设置最大登录尝试次数
    maxAttempts := 3
    attempts := 0

    // 创建 bufio.Reader 来获取用户输入
    reader := bufio.NewReader(os.Stdin)

    // 提示用户输入
    for attempts < maxAttempts {
        // 获取用户名输入
        fmt.Print("请输入用户名:")
        username, _ := reader.ReadString('\n')
        username = strings.TrimSpace(username) // 去除两边空白字符

        // 获取密码输入
        fmt.Print("请输入密码:")
        password, _ := reader.ReadString('\n')
        password = strings.TrimSpace(password) // 去除两边空白字符

        // 验证用户名和密码
        if username == correctUsername && password == correctPassword {
            fmt.Println("登录成功!欢迎进入系统。")
            return
        } else {
            attempts++
            fmt.Printf("登录失败,您还有 %d 次尝试机会。\n", maxAttempts-attempts)
        }
    }

    // 超过最大尝试次数
    fmt.Println("多次登录失败,系统退出。")
}

六、📊 示例运行

输入示例:

复制代码
请输入用户名:admin
请输入密码:123456

输出结果:

复制代码
登录成功!欢迎进入系统。

七、📌 核心实现解析

    1. 预设用户名与密码
    ini 复制代码
    const correctUsername = "admin"
    const correctPassword = "123456"
    1. 获取用户输入

    使用 bufio.NewReader 来读取用户输入,避免空格影响用户名或密码:

    css 复制代码
    username, _ := reader.ReadString('\n')
    password, _ := reader.ReadString('\n')
    1. 判断输入是否匹配

    使用 if 条件判断用户名和密码是否与预设值相符:

    ini 复制代码
    if username == correctUsername && password == correctPassword {
        fmt.Println("登录成功!")
    }
    1. 错误尝试次数控制

    最大登录尝试次数设置为 3 次,如果失败则提示并退出:

    arduino 复制代码
    if attempts >= maxAttempts {
        fmt.Println("多次登录失败,系统退出。")
    }

八、💡 拓展练习建议

    1. 增强安全性:通过加密方式保存密码(如bcrypt);
    1. 增加密码复杂度要求:如至少包含数字和字母;
    1. 改为注册功能:用户输入用户名和密码进行注册,再验证登录;
    1. 限制登录时间:例如,设置间隔时间,3次失败后等待10分钟;
    1. GUI 界面实现:尝试通过图形界面来模拟登录界面;

九、⚠️ 常见问题

问题 原因 解决方法
用户输入时有空格或换行符 ReadString('\n') 会读取换行符 使用 strings.TrimSpace() 去除两边空格和换行符
忘记输入用户名/密码 用户输入不匹配 通过条件判断提前检查输入内容是否为空
忘记密码或用户名 用户输入错误 提示错误,并限制最大输入次数

🔚 小结

通过这个案例,你学会了:

  • • 如何处理用户输入并进行字符串比较;
  • • 如何模拟简单的登录验证系统;
  • • 如何控制登录次数,避免恶意尝试。

这些是任何应用程序中常见的登录机制,了解其背后原理,将为你后续学习更高级的身份验证和安全技术打下基础。

相关推荐
掘金码甲哥16 小时前
🚀糟糕,我实现的k8s informer好像是依托答辩
后端
GoGeekBaird16 小时前
Andrej Karpathy:2025年大模型发展总结
后端·github
uzong16 小时前
听一听技术面试官的心路历程:他们也会有瓶颈,也会表现不如人意
后端
Jimmy16 小时前
年终总结 - 2025 故事集
前端·后端·程序员
吴佳浩 Alben18 小时前
Python入门指南(四)
开发语言·后端·python
倚栏听风雨18 小时前
lombook java: 找不到符号
后端
码财小子19 小时前
记一次服务器大并发下高延迟问题的定位
后端
我是小妖怪,潇洒又自在19 小时前
springcloud alibaba(九)Nacos Config服务配置
后端·spring·spring cloud
Victor35619 小时前
Netty(26)如何实现基于Netty的RPC框架?
后端