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)
        }
    }
}
View Code

结构体+方法的形式实现:

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)
    }
}
View Code

 若有多个go文件,执行的时候需要全部指定:go run main.go xx.go xx.go

posted @ 2019-05-02 15:57  我是一条最咸的咸鱼  阅读(325)  评论(0编辑  收藏  举报
返回顶部