GO语言实现一个简单的纯后端学员管理系统
项目总览:
1.开发语言:GO语言
2.IDE:Goland
3.开发用时:一个小时
4.源码已上传到我的GitHub,链接:https://github.com/2394799692/Student-management-system 或点此跳转
以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步。——来自考研路上的lwj。QQ:2394799692
一、项目开发日志
//1.添加学员信息
//2.编辑学员信息
//3.展示所有学员信息
//分析需求:
//先写一个学生结构体,打印一个系统菜单,等待用户选择要执行的选项,执行相应动作
二、前情知识补充
1.构造函数:用来在创建对象时初始化对象
Go语言的结构体没有构造函数,我们可以自己实现。 例如,下方的代码就实现了一个person的构造函数。 因为struct是值类型,如果结构体比较复杂的话,值拷贝性能开销会比较大,所以该构造函数返回的是结构体指针类型。
func newPerson(name, city string, age int8) *person {
return &person{
name: name,
city: city,
age: age,
}
}
//调用构造函数
p9 := newPerson("张三", "沙漠", 90)
fmt.Printf("%#v\n", p9) //&main.person{name:"张三", city:"沙漠", age:90}
2.方法和接收者
Go语言中的方法(Method)是一种作用于特定类型变量的函数。这种特定类型变量叫做接收者(Receiver)。接收者的概念就类似于其他语言中的this或者 self。
//方法定义格式:
func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) {
函数体
}
//案例
//Person 结构体
type Person struct {
name string
age int8
}
//NewPerson 构造函数
func NewPerson(name string, age int8) *Person {
return &Person{
name: name,
age: age,
}
}
//Dream Person做梦的方法
func (p Person) Dream() {
fmt.Printf("%s的梦想是学好Go语言!\n", p.name)
}
func main() {
p1 := NewPerson("小王子", 25)
p1.Dream()
}
方法与函数的区别是,函数不属于任何类型,方法属于特定的类型。
三、主函数中的内容
func main() {
sm := newStudentMgr()
for {
showMenu() //1.打印一个系统菜单
//2.等待用户选择要执行的选项
var input int
fmt.Print("请输入你要操作的序号:")
fmt.Scanf("%d\n", &input)
fmt.Println("用户输入的是:", input)
//3.执行相应动作
switch input {
case 1:
stu := getInput()
sm.addStudent(stu)
case 2:
stu := getInput()
sm.modifyStudent(stu)
case 3:
sm.showStudent()
case 4:
os.Exit(0)
}
}
}
四、逐个自定义函数拆解分析
1.显示菜单showMenu()函数
func showMenu() {
fmt.Println("欢迎来到学员信息管理系统")
fmt.Println("1.添加学员")
fmt.Println("2.编辑学员信息")
fmt.Println("3.展示所有学员信息")
fmt.Println("4.退出系统")
}
2.添加学员addStudent()函数
func (s *studentMgr) addStudent(newStu *student) {
s.allStudents = append(s.allStudents, newStu)
}
3.编辑学员 modifyStudent()函数
func (s *studentMgr) modifyStudent(newStu *student) {
for i, v := range s.allStudents {
if newStu.id == v.id { //当学号相同时,表示找到了要修改的学生
s.allStudents[i] = newStu //根据切片的索引直接把新学生赋值进来
return
}
//如果走到这里说明输入的学生没有找到
fmt.Println("输入的学生信息有误,系统中没有学号是:%d的学生\n", newStu.id)
}
}
4.展示学员 showStudent()函数
func (s *studentMgr) showStudent() {
for _, v := range s.allStudents {
fmt.Printf("学号:%d 姓名:%s 班级:%s\n", v.id, v.name, v.class)
}
}
五、所有代码展示
1.main.go
package main
import (
"fmt"
"os"
)
//学员信息管理系统
//1.添加学员信息
//2.编辑学员信息
//3.展示所有学员信息
//分析需求:
//先写一个学生结构体,打印一个系统菜单,等待用户选择要执行的选项,执行相应动作
func showMenu() {
fmt.Println("欢迎来到学员信息管理系统")
fmt.Println("1.添加学员")
fmt.Println("2.编辑学员信息")
fmt.Println("3.展示所有学员信息")
fmt.Println("4.退出系统")
}
//获取用户输入的学员信息
func getInput() *student { //返回值stu为*student类型
var (
id int
name string
class string
)
fmt.Println("请按要求输入学员信息")
fmt.Print("请输入学员的学号:")
fmt.Scanf("%d\n", &id)
fmt.Print("请输入学员的姓名:")
fmt.Scanf("%s\n", &name)
fmt.Print("请输入学员的班级:")
fmt.Scanf("%s\n", &class)
//就能拿到用户输入的学员的所有信息
stu := newStudent(id, name, class) //调用student的构造函数构造一个学生
return stu
}
func main() {
sm := newStudentMgr()
for {
showMenu() //1.打印一个系统菜单
//2.等待用户选择要执行的选项
var input int
fmt.Print("请输入你要操作的序号:")
fmt.Scanf("%d\n", &input)
fmt.Println("用户输入的是:", input)
//3.执行相应动作
switch input {
case 1:
stu := getInput()
sm.addStudent(stu)
case 2:
stu := getInput()
sm.modifyStudent(stu)
case 3:
sm.showStudent()
case 4:
os.Exit(0)
}
}
}
2.student.go
package main
import "fmt"
//定义一个结构体描述学生信息
type student struct {
id int
name string
class string
}
//定义student类型的构造函数
func newStudent(id int, name, class string) *student {
return &student{
id: id,
name: name,
class: class,
}
}
//学员管理的类型
type studentMgr struct {
allStudents []*student //定义一个student类型的切片
}
//这是studentMgr的构造函数
func newStudentMgr() *studentMgr {
return &studentMgr{
allStudents: make([]*student, 0, 100), //初始化切片
}
}
//1.添加学员
func (s *studentMgr) addStudent(newStu *student) {
s.allStudents = append(s.allStudents, newStu)
}
//2.编辑学员
func (s *studentMgr) modifyStudent(newStu *student) {
for i, v := range s.allStudents {
if newStu.id == v.id { //当学号相同时,表示找到了要修改的学生
s.allStudents[i] = newStu //根据切片的索引直接把新学生赋值进来
return
}
//如果走到这里说明输入的学生没有找到
fmt.Println("输入的学生信息有误,系统中没有学号是:%d的学生\n", newStu.id)
}
}
//3.展示学生
func (s *studentMgr) showStudent() {
for _, v := range s.allStudents {
fmt.Printf("学号:%d 姓名:%s 班级:%s\n", v.id, v.name, v.class)
}
}
六、效果展示:
1)开始页面:
2)添加学员:
3)修改学员和查看学员:
4)退出页面: