#### Go 面向对象编程应用前面学习了很多的基础知识,这一节来实际写一个小案例:涉及到的知识: 1. 数组的基本使用2. 结构体3. 切片  4. 方法5. 循环6. 函数返回值(命名返回值,普通返回值)备注: 大家也可以在上面加入从终端获取用户信息,将方法动作根据终端选择绑定---案例1: 班级管理系统1. 默认3个班级2. 学生有姓名,年龄,所在班级属性3. 学生可以选择加入班级,切换班级
package mainimport ("errors""fmt"
)// 学生信息
type Student struct {// 名称Name string// 年龄Age int// 所属班级Class string
}// 班级信息
type Class struct {// 班级名称Name string// 班级中所有的学生Students []Student
}// 班级列表
var CLASS = [3]Class{{Name: "Music"},{Name: "Math"},{Name: "English"},
}
// 显示学生的信息: 名称,年龄,所属班级
func (s *Student) showInfo() {fmt.Printf("Name: %s,Age: %d,Class: %s\n", s.Name, s.Age, s.Class)
}// 加入班级方法
func (s *Student) joinClass(class string) {// 加入班级前判断是否已经加入班级//TODO 如果初始化学生实例设置了class 则不能加入任何班级if s.Class != "" {return}var err error// 要加入班级的索引var classIndex intclassIndex, err = searchClassByName(class)// 根据查找的值处理是否加入班级if err == nil {// 更改学生的班级s.Class = classCLASS[classIndex].Students = append(CLASS[classIndex].Students, *s)} else {// 要加入的班级不存在fmt.Println("class is not exist,join failed")}
}// 学生换班级方法
func (s *Student) changeClass(class string) {// 换班级前先检查是否已经在某个班级if s.Class == class {fmt.Println("当前学生已存在目标班级")return}var err errorvar index int // 目标班级的索引index, err = searchClassByName(class)if err != nil {// 查找的班级不存在fmt.Println("查找的班级不存在")return}// 将学生加入到新的班级学生列表中CLASS[index].Students = append(CLASS[index].Students, *s)// 学生原来的班级索引oldStudentClassIndex, _ := searchClassByName(s.Class)// 查找学生的索引studentIndex := searchStudentByName(oldStudentClassIndex, s.Name)// 使用新的切片存储var newStudents = make([]Student, 0)if studentIndex != 0 {newStudents = append(CLASS[index].Students[:studentIndex], CLASS[index].Students[index+1:]...)}CLASS[oldStudentClassIndex].Students = newStudents// 加入新班级后将学生的班级更新s.Class = class
}// 根据班级名称查找班级的索引
func searchClassByName(class string) (index int, err error) {for i, val := range CLASS {if val.Name == class {index = ireturn}}err = errors.New("class is not exist")return
}// 根据学生名称和班级索引查找学生索引
// 此函数由从学生的信息上获取class 名称,再通过class 名称查找到class 的索引,所以这个函数没有错误
// TODO 如果调用的场景不是上述描述的应该会有错误
func searchStudentByName(class int, name string) (index int) {for i, val := range CLASS[class].Students {if val.Name == name {// 查找到了学生index = i}}return
}// 查看所有班级的信息
func showClassInfo() {for _, val := range CLASS {fmt.Println("当前班级:", val.Name)for _, stu := range val.Students {fmt.Println("当前班级有学生:", stu)}}
}// 初始化一个学生
func newStudent(name string, age int) Student {s := Student{Name: name,Age:  age,}return s
}
func main() {// xiaoMing 加入Musicvar xiaoMing StudentxiaoMing = newStudent("xiaoMing", 20)xiaoMing.joinClass("Music")xiaoMing.showInfo()// xiaoHu加入Musicvar xiaoHu StudentxiaoHu = newStudent("xiaoHu", 18)xiaoHu.joinClass("Music")xiaoHu.showInfo()// xiaoHong 加入Mathvar xiaoHong StudentxiaoHong.Name = "xiaoHong"xiaoHong.Age = 22xiaoHong.joinClass("Math")xiaoHong.showInfo()// xiaoHua 加入EnglishxiaoHua := Student{Name: "xiaoHua",Age:  23,}xiaoHua.joinClass("English")xiaoHua.showInfo()// xiaoJia 加入不存在的班级PaintxiaoJia := Student{Name: "xiaoJia",Age:  21,}xiaoJia.joinClass("Paint")xiaoJia.showInfo()showClassInfo()fmt.Println("xiaoHu change class Math")xiaoHu.changeClass("Math")showClassInfo()xiaoHu.showInfo()fmt.Println("xiaoHua change class Math")xiaoHua.changeClass("Math")showClassInfo()xiaoHua.showInfo()
}

  个人微信公众号会发布最新文章,欢迎关注一同交流学习

转载于:https://www.cnblogs.com/Mail-maomao/p/11458983.html

Go 面向对象编程应用相关推荐

  1. 【面向对象编程】(4) 类的继承,重构父类中的方法

    各位同学好,今天和大家分享一下面向对象编程中,类的三大特征之继承.主要介绍:子类继承父类的基本方法:重写父类的类方法:重构父类的初始化方法:super() 方法.本节主要是单继承,多继承在下一节中介绍 ...

  2. 【面向对象编程】(3) 类之间的交互,依赖关系,关联关系

    各位同学好,今天和大家分享一下面向对象编程中,类之间的交互,类之间的依赖关系和关联关系.有不明白的可见前一章节:https://blog.csdn.net/dgvv4/article/details/ ...

  3. 【面向对象编程】(1) 类实例化的基本方法

    各位同学好,本章节和大家分享一下面向对象编程的一些方法,通过一些案例带大家由浅入深掌握面向对象的编程. 1. 最基本的类实例化 创建类的方法是 class 变量名: ,实例化方法是 类名() ,分配属 ...

  4. C#编程概念系列(一):面向对象编程

    系列文章索引目录:http://www.cnblogs.com/loner/archive/2013/05/09/3068211.html 引子: 面向对象编程:这个在当下已不是什么时髦的概念,但通过 ...

  5. JavaScript面向对象编程

    自从有了Ajax这个概念,JavaScript作为Ajax的利器,其作用一路飙升.JavaScript最基本的使用,以及语法.浏览器对象等等东东在这里就不累赘了.把主要篇幅放在如何实现JavaScri ...

  6. python面向对象的优点_Python面向对象编程——总结面向对象的优点

    Python面向对象编程--总结面向对象的优点 一.从代码级别看面向对象 1.在没有学习类这个概念时,数据与功能是分离的 def exc1(host,port,db,charset): conn=co ...

  7. 转载知乎上的一篇:“ 面向对象编程的弊端是什么?”

    2019独角兽企业重金招聘Python工程师标准>>> 弊端是,没有人还记得面向对象原本要解决的问题是什么. 1.面向对象原本要解决什么(或者说有什么优良特性) 似乎很简单,但实际又 ...

  8. c语言面向对象编程中的类_C ++中的面向对象编程

    c语言面向对象编程中的类 Object oriented programming, OOP for short, aims to implement real world entities like ...

  9. ruby 新建对象_Ruby面向对象编程的简介

    ruby 新建对象 by Saul Costa 由Saul Costa Object-oriented programming (OOP) is a programming paradigm orga ...

  10. 面向对象编程概念_如何向6岁的孩子解释面向对象的编程概念

    面向对象编程概念 by Alexander Petkov 通过亚历山大·佩特科夫(Alexander Petkov) Have you noticed how the same cliche ques ...

最新文章

  1. Spring Cloud系列:不重启eureka,清除down掉的服务
  2. CentOS6.2部署qt开发环境
  3. Security+jwt+验证码实现验证和授权
  4. mysql索引如何做_5分钟,告诉你MySQL字符串怎么做索引
  5. javascript中的replace方法
  6. hashCode()方法的性能优化
  7. jmeter之使用代理录制脚本
  8. 某人分析的70后,80后,90后
  9. curl源码编译安装
  10. geo差异表达分析_GEO2R差异表达分析软件
  11. Kinect2.0相机标定
  12. HashMap源码分析与实现
  13. Gyro陀螺仪 > MPU 6000 vs ICM 20689
  14. Moya、RxMoya基本使用
  15. 【2020-10-28】DS12C887+驱动
  16. vue项目 编辑器保存代码后自动更新浏览器页面内容
  17. nmn什么功效,烟酰胺单核苷酸的功效和作用,在忙也要看一看
  18. 阿里巴巴集团副总裁陈丽娟对话VMware全球副总裁原欣:助力企业数字化转型
  19. Linux报You might want to save “/run/initramfs/rdsosreport.txt“ to a USB stick or /boot after mounting
  20. 2009年央视春晚最新节目单

热门文章

  1. python递归函数代码_Python递归函数
  2. ubuntu20.0.4更新至中文环境 | 具体步骤 + 图文详解
  3. Java里的字符串, String类简单介绍.
  4. 关于一维数组和二位数组的数组指针
  5. Orace 数据字典表前缀 解释。
  6. mongodb 分组聚合_MongoDB按键值对进行聚合/分组
  7. python分割数字_python实现整数拆分,输出拆分序列
  8. OpenKruise :SidecarSet 助力 Mesh 容器热升级
  9. 计算机教学与课程论专业,东北师范大学专业介绍:计算机课程与教学论
  10. java 内部类怎么new_[转]【Java】内部类(Inner Class)如何创建(new)