GO函数与面向对象小练习
需求:
- 写一个学生管理系统
- 学生有姓名 年龄 id 班级
- 增加学生/修改学生/删除学生/展示学生
- 用结构体+方法的形式(面向对象的思维方式)
函数方式实现:
//函数方式实现 package main import ( "fmt" "os" ) //定义一个学生结构体 type student struct { name ,class string age ,id int } //定义一个存放student指针的切片,存放学生信息 var allStu = make([]*student,0,100) //定义一个添加学生的构造函数 func newStu(name ,class string,id ,age int) *student { return &student{ name:name, age:age, id:id, class:class, } } //定义一个展示函数 func listMenu() { fmt.Println("===欢迎进入学生管理系统===") fmt.Println(" 1.增加学生 ") fmt.Println(" 2.修改学生 ") fmt.Println(" 3.删除学生 ") fmt.Println(" 4.展示学生 ") fmt.Println(" 5.退出系统 ") fmt.Println("===欢迎进入学生管理系统===") } //增加学生 func addStu() { //fmt.Println("add") var ( name ,class string id ,age int ) //获取用户输入 fmt.Println("增加学生信息,请输入以下信息!") fmt.Print("请输入学生姓名:") fmt.Scanln(&name) //判断学生是否存在 if len(allStu) !=0{ for _,v :=range allStu{ if v.name == name{ fmt.Printf("%s学生已经存在!\n",name) return } } } fmt.Print("请输入学生ID:") fmt.Scanln(&id) fmt.Print("请输入学生年龄:") fmt.Scanln(&age) fmt.Print("请输入学生班级:") fmt.Scanln(&class) fmt.Println(name, id, age, class) //保存学生信息 student := newStu(name, class, age, id) allStu = append(allStu, student) fmt.Printf("%s学生添加成功!\n", student.name) } //修改学生 func updateStu() { //fmt.Println("update") var ( name ,class string id ,age int ) //判断allStu是否有内容 if len(allStu) == 0{ fmt.Println("没有查询到学生信息,请添加学生!") return } //获取用户输入 fmt.Println("修改学生信息,请输入以下信息!") fmt.Print("请输入学生姓名:") fmt.Scanln(&name) //如果学生存在 for index,v := range allStu{ if v.name == name{ fmt.Print("请输入学生ID:") fmt.Scanln(&id) fmt.Print("请输入学生年龄:") fmt.Scanln(&age) fmt.Print("请输入学生班级:") fmt.Scanln(&class) allStu[index] = newStu(name,class,id,age) fmt.Printf("%s学生修改成功!\n",name) return } } fmt.Printf("%s学生不存在,请添加!\n",name) } //删除学生 func delStu() { //fmt.Println("del") if len(allStu) == 0{ fmt.Println("没有查询到学生信息,请添加学生!") return } var ( name string ) //获取用户输入 fmt.Println("删除学生信息,请输入以下信息!") fmt.Print("请输入学生姓名:") fmt.Scanln(&name) //判断学生是否存在 for index,v := range allStu{ if v.name == name{ fmt.Printf("%s学生存在,即将删除...\n",name) allStu = append(allStu[:index],allStu[index+1:]...) fmt.Printf("%s学生删除成功!\n",name) return } } fmt.Printf("%s学生不存在,无法删除!\n",name) } //展示学生 func listStu() { //fmt.Println("list") if len(allStu) == 0{ fmt.Println("没有查询到学生信息,请添加学生!") return } fmt.Println("=========学生信息展示============") for _,v := range allStu{ fmt.Printf("姓名:%s,学号:%d,年龄:%d,班级:%s\n",v.name,v.id,v.age,v.class) } fmt.Println("===============================") } func main() { for{ listMenu() var id int fmt.Print("请输入序号:") fmt.Scanln(&id) switch id { case 1: addStu() case 2: updateStu() case 3: delStu() case 4: listStu() case 5: fmt.Println("再见!") os.Exit(0) } } }
结构体+方法的形式实现:
main.go package main import ( "fmt" "os" ) //定义一个展示函数 func showMenu() { fmt.Println("===欢迎进入学生管理系统===") fmt.Println(" 1.增加学生 ") fmt.Println(" 2.修改学生 ") fmt.Println(" 3.删除学生 ") fmt.Println(" 4.展示学生 ") fmt.Println(" 5.退出系统 ") fmt.Println("===欢迎进入学生管理系统===") } //接受用户输入 func userInput() *Student { var ( name string id int age int class string ) fmt.Println("按照提示输入信息:") fmt.Println("请输入姓名:") fmt.Scanln(&name) fmt.Println("请输入年龄:") fmt.Scanln(&age) fmt.Println("请输入学号:") fmt.Scanln(&id) fmt.Println("请输入年级:") fmt.Scanln(&class) newStu := NewStudent(name,id,age,class) return newStu } func main() { stuMgr := NewStudentMgr() for{ showMenu() var i int fmt.Print("请输入序号:") fmt.Scanln(&i) switch i { case 1: //添加学生 newStu := userInput() stuMgr.AddStudent(newStu) case 2: //修改学生 newStu := userInput() stuMgr.EditStudent(newStu) case 3: // 删除学生 newStu := userInput() stuMgr.DeleteStudent(newStu) case 4: // 展示学生 stuMgr.ShowStudent() case 5: // 退出 os.Exit(0) default: fmt.Println("输入无效") } } } stu_struct.go //结构体+方法方式实现 package main import "fmt" //写一个学生管理系统(要交的作业) //1. 学生有姓名 年龄 id 班级 //2. 增加学生/修改学生/删除学生/展示学生 //3. 用结构体+方法的形式(面向对象的思维方式) // Student 学生结构体 type Student struct { name string age int id int class string } // NewStudent 是一个创造新学生对象构造函数 func NewStudent(name string, age int, id int, class string) *Student { return &Student{ name: name, age: age, id: id, class: class, } } // StudetMgr 定义一个学生信息管理的结构体 type StudetMgr struct { AllStudents []*Student } // NewStudentMgr 创建新的学生信息管理结构体对象 func NewStudentMgr() *StudetMgr { return &StudetMgr{ AllStudents:make([]*Student,0,100), } } // AddStudent 添加学生的方法 func (s *StudetMgr) AddStudent(stu *Student) { for _,v := range s.AllStudents{ if v.name == stu.name{ fmt.Printf("姓名为%s的学生已经存在\n",stu.name) return } } s.AllStudents= append(s.AllStudents,stu) } // EditStudent 修改学生的方法 func (s *StudetMgr) EditStudent(stu *Student) { for index,v := range s.AllStudents{ if v.name == stu.name{ s.AllStudents[index] = stu return } } fmt.Printf("姓名为%s的学生不存在\n",stu.name) } // DeleteStudent 删除学生的方法 func (s *StudetMgr) DeleteStudent(stu *Student) { for index,v := range s.AllStudents{ if v.name == stu.name{ s.AllStudents = append(s.AllStudents[:index],s.AllStudents[index+1:]...) return } } fmt.Printf("姓名为%s的学生不存在\n",stu.name) } // ShowStudent 展示学生的方法 func (s *StudetMgr) ShowStudent() { for _,v := range s.AllStudents{ fmt.Printf("name: %s age:%d id:%d class:%s\n", v.name, v.age, v.id, v.class) } }
若有多个go文件,执行的时候需要全部指定:go run main.go xx.go xx.go