【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)退出页面:在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

立志冲海大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值