Go语法练习小项目

📅 发布时间:2026/7/4 14:30:13 👁️ 浏览次数:
Go语法练习小项目
学生信息管理系统(简单练习Go基础语法)1.简单概述(1)基本功能控制台项目,实现注册,登录,退出系统的菜单栏,实现用户界面的添加学生信息,查找学生信息,返回上级界面的功能.数据备份仅使用简单的文件操作(2)项目定位简单的自己规划的项目可以简单练习语法(不包括 反射 协程 接口使用等较高级语法),一般30min左右可以结束这个小项目,适合刚学习完Go语法的同学食用2,项目展示3.代码详解packagemainimport(bufiofmtioosstrings)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_,errwriter.WriteString(write_str)iferr!nil{fmt.Println(写入学生信息失败:,err)return}// 确保数据刷新到磁盘writer.Flush()fmt.Println(学生信息添加成功)}funcshow_user_menu(namestring){fmt.Printf(欢迎 %s 光临!\n,name)varchoiceintvaris_runningbooltrueforis_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_runningfalsecontinuedefault: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_,errfile.Write([]byte(writer_str))iferrnil{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{iferrio.EOF{break}returnfalse}// 提取用户名部分进行比较parts:strings.Split(strings.TrimRight(str,\n),:)iflen(parts)1parts[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{iferrio.EOF{// 文件读取完毕没有找到匹配的用户fmt.Println(登录失败用户名或密码错误)return}else{fmt.Println(读取文件失败!,err)return}}// 去除字符串末尾的换行符strstrings.TrimRight(str,\n)ifstruser_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_runningfalsecontinuedefault: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)//结束标志是 errio.EOF//或者scanner,err:bufio.NewScanner(file)//结束标志是 scanner.Scan()//一次性读取文件 一次性读取文件的全部内容os.ReadFile(file_namestring)([]byte,err)写入文件writer:bufio.NewWriter(file)// 创建带缓冲的 Writern,err:writer.Write([]byte(先写入缓冲区))// 数据尚未写入磁盘仍在内存缓冲区中errwriter.Flush()// 必须调用 Flush 将缓冲区数据真正写入文件// 结束标志Flush 返回 nil 表示成功// 直接通过文件路径写入数据覆盖或创建err:os.WriteFile(example.txt,[]byte(要写入的完整内容),0644)// 返回 error如果为 nil 则表示成功写入同时注意 File自带的Read和Write每一次使用就是一次系统调用,避免小量频繁使用