当前位置: 首页 > news >正文

Go语法练习小项目

学生信息管理系统(简单练习Go基础语法)

1.简单概述

(1)基本功能

控制台项目,实现注册,登录,退出系统的菜单栏,实现用户界面的添加学生信息,查找学生信息,返回上级界面的功能.数据备份仅使用简单的文件操作

(2)项目定位

简单的自己规划的项目可以简单练习语法(不包括 反射 协程 接口使用等较高级语法),一般30min左右可以结束这个小项目,适合刚学习完Go语法的同学食用

2,项目展示



3.代码详解

packagemainimport("bufio""fmt""io""os""strings")funcshow_menu(){fmt.Println("欢迎来到学生管理系统!")fmt.Println("1,注册")fmt.Println("2,登录")fmt.Println("3,退出")fmt.Println("请输入您的选择:")}funcget_info(){file,err:=os.Open("student.txt")iferr!=nil{fmt.Println("打开学生文件失败:",err)return}deferfile.Close()reader:=bufio.NewReader(file)res,err:=io.ReadAll(reader)iferr!=nil{fmt.Println("读取学生信息失败:",err)return}iflen(res)==0{fmt.Println("暂无学生信息")}else{fmt.Println("学生信息列表:")fmt.Println(string(res))}}funcadd_info(){varnamestringvaragestringvaridstringfmt.Println("请输入学生姓名:")fmt.Scanln(&name)fmt.Println("请输入学生年龄:")fmt.Scanln(&age)fmt.Println("请输入学生学号:")fmt.Scanln(&id)// 使用 O_APPEND 标志,这样不会覆盖原有内容file,err:=os.OpenFile("student.txt",os.O_WRONLY|os.O_CREATE|os.O_APPEND,0666)iferr!=nil{fmt.Println("打开文件失败!",err)return}deferfile.Close()writer:=bufio.NewWriter(file)write_str:=name+" "+age+" "+id+"\n"_,err=writer.WriteString(write_str)iferr!=nil{fmt.Println("写入学生信息失败:",err)return}// 确保数据刷新到磁盘writer.Flush()fmt.Println("学生信息添加成功")}funcshow_user_menu(namestring){fmt.Printf("欢迎 %s 光临!\n",name)varchoiceintvaris_runningbool=trueforis_running{fmt.Println("1,查找学生信息")fmt.Println("2,添加学生信息")fmt.Println("3,退回上级菜单")fmt.Print("请输入您的选择: ")// 清除之前的输入缓冲区fmt.Scan(&choice)switchchoice{case1:get_info()case2:add_info()case3:fmt.Println("返回上级菜单!")is_running=falsecontinuedefault:fmt.Println("错误选项!")}ifis_running{fmt.Println("按任意键继续...")getchar()Clear()}}}funcClear(){fmt.Print("\033[H\033[2J")}funcregister(){//获取用户名和密码varusernamestringvarpasswordstringfmt.Println("请输入您的用户名:")fmt.Scanln(&username)fmt.Println("请输入您的密码:")fmt.Scanln(&password)// 检查用户名是否已存在ifcheckUserExists(username){fmt.Println("用户名已存在,请使用其他用户名")return}//写入文件file,err:=os.OpenFile("user.txt",os.O_RDWR|os.O_APPEND|os.O_CREATE,0666)iferr!=nil{fmt.Println("用户注册失败(打开用户文件)!",err)return}deferfile.Close()writer_str:=username+":"+password+"\n"_,err=file.Write([]byte(writer_str))iferr==nil{fmt.Println("用户注册成功")}else{fmt.Println("用户注册失败(写入用户文件)!",err)return}}// 检查用户名是否已存在funccheckUserExists(usernamestring)bool{file,err:=os.Open("user.txt")iferr!=nil{// 文件不存在,说明还没有任何用户returnfalse}deferfile.Close()reader:=bufio.NewReader(file)for{str,err:=reader.ReadString('\n')iferr!=nil{iferr==io.EOF{break}returnfalse}// 提取用户名部分进行比较parts:=strings.Split(strings.TrimRight(str,"\n"),":")iflen(parts)>=1&&parts[0]==username{returntrue}}returnfalse}funclogin(){varusernamestringvarpasswordstringfmt.Println("请输入您的用户名:")fmt.Scanln(&username)fmt.Println("请输入您的密码:")fmt.Scanln(&password)//只读打开文件file,err:=os.Open("user.txt")iferr!=nil{fmt.Println("用户登录失败(打开文件阶段)!",err)return}deferfile.Close()user_str:=username+":"+password//读取文件里面每一行数据reader:=bufio.NewReader(file)for{str,err:=reader.ReadString('\n')iferr!=nil{iferr==io.EOF{// 文件读取完毕,没有找到匹配的用户fmt.Println("登录失败:用户名或密码错误")return}else{fmt.Println("读取文件失败!",err)return}}// 去除字符串末尾的换行符str=strings.TrimRight(str,"\n")ifstr==user_str{fmt.Println("登录成功")show_user_menu(username)return}// 如果没匹配,继续循环}}funcgetchar(){reader:=bufio.NewReader(os.Stdin)_,_=reader.ReadByte()}funcmain(){is_running:=trueforis_running{//打印菜单show_menu()//接收选择varchoiceintfmt.Scan(&choice)//调用接口switchchoice{case1:register()case2:login()case3:fmt.Println("退出系统...")is_running=falsecontinuedefault:fmt.Println("无效选择,请重新输入")}ifis_running{fmt.Println("按任意键继续...")getchar()Clear()}}}

模仿c++的getchar()吃掉单个字符

funcgetchar(){reader:=bufio.NewReader(os.Stdin)_,_=reader.ReadByte()}

简单实现清屏函数

funcClear(){fmt.Print("\033[H\033[2J")}

4.接口总结

其实这个项目的难点就是文件相关操作,下面给大家系统总结一下简单文件读取接口

打开文件

os.Open(file_namestring)(*File,error)

只读方式打开一个文件

os.Create(file_namestring)(*File,error)

读写方式打开文件 如果文件不在就创建 如果文件存在就清空

os.OpenFIle(file_namestring,flagint,perm FileMode)(*File,error)

参数2:打开文件的模式 一些读 写 创建 追加 存在 等参数指定使用位或组合
参数3:文件的权限指定

读取文件

//自带缓冲区读取文件reader,err:=bufio.NewReader(file)//结束标志是 err==io.EOF//或者scanner,err:=bufio.NewScanner(file)//结束标志是 scanner.Scan()//一次性读取文件 一次性读取文件的全部内容os.ReadFile(file_namestring)([]byte,err)

写入文件

writer:=bufio.NewWriter(file)// 创建带缓冲的 Writern,err:=writer.Write([]byte("先写入缓冲区"))// 数据尚未写入磁盘,仍在内存缓冲区中err=writer.Flush()// 必须调用 Flush 将缓冲区数据真正写入文件// 结束标志:Flush 返回 nil 表示成功// 直接通过文件路径写入数据(覆盖或创建)err:=os.WriteFile("example.txt",[]byte("要写入的完整内容"),0644)// 返回 error,如果为 nil 则表示成功写入

同时注意 File自带的Read和Write每一次使用就是一次系统调用,避免小量频繁使用

http://www.jsqmd.com/news/461413/

相关文章:

  • 核心接口使用(四)Tool和MCP(2)MCP Server
  • Flutter 组件 ipaddr 适配鸿蒙 HarmonyOS 实战:高性能 IP 地址解析,构建子网掩码治理与网络边界安全架构
  • 票务预约系统代码3
  • 携程任我行礼品卡快速变现秘诀,这些回收渠道你知道吗? - 团团收购物卡回收
  • 基于Java springboot果蔬种植销售服务平台系统(源码+文档+运行视频+讲解视频)
  • Laravel 10.x重磅更新:12大核心特性解析
  • 市面上口碑好的不锈钢水槽拉伸成型液压机制造商推荐榜单,冷拉伸/深冲压/一次成型/单动薄板/双动拉伸/自动化生产线,不锈钢水槽拉伸成型液压机实力厂家怎么选 - 品牌推广师
  • 【OS】存储管理(内存管理)核心知识点详解
  • Pytorch1 PyTorch 官方 QuickStart 超详细笔记|
  • 智能科学与技术毕业设计易上手项目选题怎么做
  • dynamic-datasource-spring-boot-starter -动态数据源详解
  • S2b电商系统哪家好?深度测评:千匠才是行业优选
  • AI短视频培训哪家更好
  • 畅回收平台:好利来卡回收首选,75折折扣,服务贴心 - 畅回收小程序
  • React 状态管理:从 Redux Toolkit 到 Jotai、Zustand等主流库中,应该如何在项目中进行选择。
  • Python 装饰器详解:从入门到精通的完整指南
  • 江苏万融系统集成有限公司:打造安全、智能、可持续的实验室全生命周期服务 - 品牌推荐用户报道者
  • 为什么选择携程任我行礼品卡回收变现?五大优势告诉你! - 团团收购物卡回收
  • ONNX 和 TensorRT是什么
  • 【MySQL进阶 | explain执行计划】
  • The_Maya_Society
  • Postman+CLA+Jenkins接口测试
  • Java继承-多态
  • 运营批量作图工具推荐:潮际好麦商品套图如何支撑日均百款上新?
  • 好利来卡回收注意事项,畅回收平台,安全可靠 - 畅回收小程序
  • 企业级日志平台实战:ELK + Filebeat + Kafka + ZooKeeper
  • 电脑提示Component mscomm32.ocx or one of its解决办法
  • Fastadmin 解决安全提示:为了你的后台安全,请勿将后台管理入口设置为admin或admin.php问题
  • [linux] 本地部署网页(windows下载node.js, 安装pnpm)
  • 【UI自动化测试】5_TPshop项目实战 _批量运行测试用例(重点)