Go实现学生管理系统[函数+面向对象(方法)]

函数版

package main
import (
	"fmt"
	"os"
)
var allStudent map[uint64]*student
type student struct {
    
    
	id   uint64
	name string
}
func newStudent(id uint64, name string) *student {
    
    
	return &student{
    
    
		id:   id,
		name: name,
	}
}
func addStudent() {
    
    
	var name string
	var id uint64
	fmt.Print("请输入学生姓名:")
	fmt.Scanln(&name)
	fmt.Print("请输入学生ID:")
	fmt.Scanln(&id)
	newStu := newStudent(id, name)
	allStudent[id] = newStu
	fmt.Print("添加成功!,继续请回车[enter]...")
	fmt.Scanln()
}
func delStudent() {
    
    
	var id uint64
	fmt.Print("请输入学生id:")
	fmt.Scanln(&id)
	if _, ok := allStudent[id]; ok {
    
    
		delete(allStudent, id)
		fmt.Print("删除成功")
	} else {
    
    
		fmt.Printf("没有该学生【%d】", id)
	}
	fmt.Print(",继续请回车[enter]...")
	fmt.Scanln()

}
func queryStudent() {
    
    
	var id uint64
	fmt.Print("请输入学生id:")
	fmt.Scanln(&id)
	if stu, ok := allStudent[id]; ok {
    
    
		fmt.Printf("%v", *stu)
	} else {
    
    
		fmt.Print("没有该学生")
	}
	fmt.Print(",继续请回车[enter]...")
	fmt.Scanln()
}
func queryAllStudent() {
    
    
	fmt.Println("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^")
	fmt.Println("学号\t姓名")
	for k, v := range allStudent {
    
    
		fmt.Printf("%d\t%v\n", k, v.name)
	}
	fmt.Println("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv")
}

func main() {
    
    
	allStudent = make(map[uint64]*student, 50)
	for {
    
    
		fmt.Println("==========================================================")
		fmt.Println("0.退出\t1.增加学生\t2.删除学生\t3.查询学生\t4.查询所有")
		fmt.Printf("请输入你的选择:")
		var choice int8
		fmt.Scanln(&choice)
		fmt.Printf("你的选择是:%d\n", choice)
		switch choice {
    
    
		case 0:
			os.Exit(1)
		case 1:
			addStudent()
		case 2:
			delStudent()
		case 3:
			queryStudent()
		case 4:
			queryAllStudent()
		default:
			fmt.Println("输入错误!请输入屏幕的数字")
		}
	}
}

面向对象(方法)

package main
import (
	"fmt"
	"os"
)
type person struct {
    
    
	id   uint64
	name string
}
type student struct {
    
    
	class string
	person
}
type admin struct {
    
    
	password string
	person
}
func (a *admin) newAdmin(id uint64, name string, password string) *admin {
    
    
	return &admin{
    
    
		password: password,
		person:   person{
    
    id: id, name: name},
	}
}
func (a *admin) newStudent(id uint64, name string, class string) *student {
    
    
	return &student{
    
    
		person: person{
    
    id: id, name: name},
		class:  class,
	}
}
func (a *admin) addStudent() {
    
    
	var name string
	var class string
	var id uint64
	fmt.Print("请输入学生姓名:")
	fmt.Scanln(&name)
	fmt.Print("请输入学生ID:")
	fmt.Scanln(&id)
	fmt.Print("请输入学生班级:")
	fmt.Scanln(&class)
	newStu := a.newStudent(id, name, class)
	allStudent[id] = newStu
	fmt.Print("添加成功!,继续请回车[enter]...")
	fmt.Scanln()
}
func (a *admin) delStudent() {
    
    
	var id uint64
	fmt.Print("请输入学生id:")
	fmt.Scanln(&id)
	if _, ok := allStudent[id]; ok {
    
    
		delete(allStudent, id)
		fmt.Print("删除成功")
	} else {
    
    
		fmt.Printf("没有该学生【%d】", id)
	}
	fmt.Print(",继续请回车[enter]...")
	fmt.Scanln()
}

func queryStudent() {
    
    
	var id uint64
	fmt.Print("请输入学生id:")
	fmt.Scanln(&id)
	if stu, ok := allStudent[id]; ok {
    
    
		fmt.Printf("%v", *stu)
	} else {
    
    
		fmt.Print("没有该学生")
	}
	fmt.Print(",继续请回车[enter]...")
	fmt.Scanln()
}
func queryAllStudent() {
    
    
	fmt.Println("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^")
	fmt.Println("\t学号\t姓名\t班级")
	for k, v := range allStudent {
    
    
		fmt.Printf("\t%d\t%v\t%s\n", k, v.name, v.class)
	}
	fmt.Println("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv")
}
var (
	allStudent map[uint64]*student
	allAdmin   map[uint64]*admin
)
func publicMenu() {
    
    
	for {
    
    
		fmt.Println("=========================欢迎回来【公共版】=========================")
		fmt.Println("\t0.返回首页\t1.查询学生\t2.查询所有")
		fmt.Printf("请输入你的选择:")
		var choice int8
		fmt.Scanln(&choice)
		switch choice {
    
    
		case 0:
			return
		case 1:
			queryStudent()
		case 2:
			queryAllStudent()
		default:
			fmt.Println("输入错误!请输入屏幕的数字")
		}
	}
}
func adminMenu(a *admin) {
    
    
	for {
    
    
		fmt.Printf("=========================欢迎回来,【%#v】管理员=========================\n", a.person.name)
		fmt.Println("\t0.注销登录\t1.增加学生\t2.删除学生\t3.查询学生\t4.查询所有")
		fmt.Printf("请输入你的选择:")
		var choice int8
		fmt.Scanln(&choice)
		switch choice {
    
    
		case 0:
			return
		case 1:
			a.addStudent()
		case 2:
			a.delStudent()
		case 3:
			queryStudent()
		case 4:
			queryAllStudent()
		default:
			fmt.Println("输入错误!请输入屏幕的数字")
		}
	}

}
func main() {
    
    
	allAdmin = make(map[uint64]*admin, 10)
	adminObj := admin{
    
    person: person{
    
    id: 1, name: "admin"}, password: "123456"}
	allAdmin[1] = &adminObj
	allStudent = make(map[uint64]*student, 50)

	var pID uint64
	var pChoice uint8
	var pPassword string
	for {
    
    
		fmt.Println("=========================欢迎来到KNHO学生管理系统=========================")
		fmt.Println("\t0.退出系统\t1.公共版面\t2.管理版面")
		fmt.Print("请输入您的选择:")
		fmt.Scanln(&pChoice)
		switch pChoice {
    
    
		case 0:
			os.Exit(1)
		case 1:
			publicMenu()
		case 2:
			fmt.Print("请输入您的账户ID:")
			fmt.Scanln(&pID)
			//查询是否是管理员
			if value, ok := allAdmin[pID]; ok {
    
    
				fmt.Printf("请输入密码: ")
				fmt.Scanln(&pPassword)
				if allAdmin[pID].password == pPassword {
    
    
					adminMenu(value) //默认成功,跳转管理员界面
				} else {
    
    
					fmt.Print("[logging failed] 密码错误,请核实您账户的密码! 继续请回车[enter]...")
					fmt.Scanln()
				}
			} else {
    
    
				fmt.Print("[logging failed] 账户不存在,请核实您的账户! 继续请回车[enter]...")
				fmt.Scanln()
			}
		default:
			fmt.Println("输入错误!请输入屏幕的数字")
		}

	}
}

细节探究
var allStudent map[uint64]studentvar allStudent map[uint64]*student的区别
在这里插入图片描述
使用指针将节省内存:首先需要实例化结构体(开辟内存块A),将结构体对象存入map的value中(这过程称为拷贝\复制,需另外开辟内存块B),一份东西放在两个地方存储。

猜你喜欢

转载自blog.csdn.net/qq_38900565/article/details/106638020