1. #### Go 面向对象编程应用
    前面学习了很多的基础知识,这一节来实际写一个小案例:
    涉及到的知识:
    1. 数组的基本使用
    2. 结构体
    3. 切片
    4. 方法
    5. 循环
    6. 函数返回值(命名返回值,普通返回值)
    备注: 大家也可以在上面加入从终端获取用户信息,将方法动作根据终端选择绑定
    ---
    案例1: 班级管理系统
    1. 默认3个班级
    2. 学生有姓名,年龄,所在班级属性
    3. 学生可以选择加入班级,切换班级
  1. package main
  2.  
  3. import (
  4. "errors"
  5. "fmt"
  6. )
  7.  
  8. // 学生信息
  9. type Student struct {
  10. // 名称
  11. Name string
  12. // 年龄
  13. Age int
  14. // 所属班级
  15. Class string
  16. }
  17.  
  18. // 班级信息
  19. type Class struct {
  20. // 班级名称
  21. Name string
  22. // 班级中所有的学生
  23. Students []Student
  24. }
  25.  
  26. // 班级列表
  27. var CLASS = [3]Class{
  28. {Name: "Music"},
  29. {Name: "Math"},
  30. {Name: "English"},
  31. }
  32. // 显示学生的信息: 名称,年龄,所属班级
  33. func (s *Student) showInfo() {
  34. fmt.Printf("Name: %s,Age: %d,Class: %s\n", s.Name, s.Age, s.Class)
  35. }
  36.  
  37. // 加入班级方法
  38. func (s *Student) joinClass(class string) {
  39. // 加入班级前判断是否已经加入班级
  40. //TODO 如果初始化学生实例设置了class 则不能加入任何班级
  41. if s.Class != "" {
  42. return
  43. }
  44. var err error
  45. // 要加入班级的索引
  46. var classIndex int
  47. classIndex, err = searchClassByName(class)
  48. // 根据查找的值处理是否加入班级
  49. if err == nil {
  50. // 更改学生的班级
  51. s.Class = class
  52. CLASS[classIndex].Students = append(CLASS[classIndex].Students, *s)
  53. } else {
  54. // 要加入的班级不存在
  55. fmt.Println("class is not exist,join failed")
  56. }
  57. }
  58.  
  59. // 学生换班级方法
  60. func (s *Student) changeClass(class string) {
  61. // 换班级前先检查是否已经在某个班级
  62. if s.Class == class {
  63. fmt.Println("当前学生已存在目标班级")
  64. return
  65. }
  66. var err error
  67. var index int // 目标班级的索引
  68. index, err = searchClassByName(class)
  69. if err != nil {
  70. // 查找的班级不存在
  71. fmt.Println("查找的班级不存在")
  72. return
  73. }
  74. // 将学生加入到新的班级学生列表中
  75. CLASS[index].Students = append(CLASS[index].Students, *s)
  76. // 学生原来的班级索引
  77. oldStudentClassIndex, _ := searchClassByName(s.Class)
  78. // 查找学生的索引
  79. studentIndex := searchStudentByName(oldStudentClassIndex, s.Name)
  80. // 使用新的切片存储
  81. var newStudents = make([]Student, 0)
  82. if studentIndex != 0 {
  83. newStudents = append(CLASS[index].Students[:studentIndex], CLASS[index].Students[index+1:]...)
  84. }
  85. CLASS[oldStudentClassIndex].Students = newStudents
  86. // 加入新班级后将学生的班级更新
  87. s.Class = class
  88. }
  89.  
  90. // 根据班级名称查找班级的索引
  91. func searchClassByName(class string) (index int, err error) {
  92. for i, val := range CLASS {
  93. if val.Name == class {
  94. index = i
  95. return
  96. }
  97. }
  98. err = errors.New("class is not exist")
  99. return
  100. }
  101.  
  102. // 根据学生名称和班级索引查找学生索引
  103. // 此函数由从学生的信息上获取class 名称,再通过class 名称查找到class 的索引,所以这个函数没有错误
  104. // TODO 如果调用的场景不是上述描述的应该会有错误
  105. func searchStudentByName(class int, name string) (index int) {
  106. for i, val := range CLASS[class].Students {
  107. if val.Name == name {
  108. // 查找到了学生
  109. index = i
  110. }
  111. }
  112. return
  113. }
  114.  
  115. // 查看所有班级的信息
  116. func showClassInfo() {
  117. for _, val := range CLASS {
  118. fmt.Println("当前班级:", val.Name)
  119. for _, stu := range val.Students {
  120. fmt.Println("当前班级有学生:", stu)
  121. }
  122. }
  123. }
  124.  
  125. // 初始化一个学生
  126. func newStudent(name string, age int) Student {
  127. s := Student{
  128. Name: name,
  129. Age: age,
  130. }
  131. return s
  132. }
  133. func main() {
  134. // xiaoMing 加入Music
  135. var xiaoMing Student
  136. xiaoMing = newStudent("xiaoMing", 20)
  137. xiaoMing.joinClass("Music")
  138. xiaoMing.showInfo()
  139. // xiaoHu加入Music
  140. var xiaoHu Student
  141. xiaoHu = newStudent("xiaoHu", 18)
  142. xiaoHu.joinClass("Music")
  143. xiaoHu.showInfo()
  144. // xiaoHong 加入Math
  145. var xiaoHong Student
  146. xiaoHong.Name = "xiaoHong"
  147. xiaoHong.Age = 22
  148. xiaoHong.joinClass("Math")
  149. xiaoHong.showInfo()
  150. // xiaoHua 加入English
  151. xiaoHua := Student{
  152. Name: "xiaoHua",
  153. Age: 23,
  154. }
  155. xiaoHua.joinClass("English")
  156. xiaoHua.showInfo()
  157. // xiaoJia 加入不存在的班级Paint
  158. xiaoJia := Student{
  159. Name: "xiaoJia",
  160. Age: 21,
  161. }
  162. xiaoJia.joinClass("Paint")
  163. xiaoJia.showInfo()
  164. showClassInfo()
  165. fmt.Println("xiaoHu change class Math")
  166. xiaoHu.changeClass("Math")
  167. showClassInfo()
  168. xiaoHu.showInfo()
  169. fmt.Println("xiaoHua change class Math")
  170. xiaoHua.changeClass("Math")
  171. showClassInfo()
  172. xiaoHua.showInfo()
  173. }

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

Go 面向对象编程应用的更多相关文章

  1. angular2系列教程(六)两种pipe:函数式编程与面向对象编程

    今天,我们要讲的是angualr2的pipe这个知识点. 例子

  2. 带你一分钟理解闭包--js面向对象编程

    上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...

  3. PHP 面向对象编程和设计模式 (1/5) - 抽象类、对象接口、instanceof 和契约式编程

    PHP高级程序设计 学习笔记 2014.06.09 什么是面向对象编程 面向对象编程(Object Oriented Programming,OOP)是一种计算机编程架构.OOP 的一条基本原则是计算 ...

  4. Delphi_09_Delphi_Object_Pascal_面向对象编程

    今天这里讨论一下Delphi中的面向对象编程,这里不做过多过细的讨论,主要做提纲挈领的描述,帮助自己抓做重点. 本随笔分为两部分: 一.面向对象编程 二.面向对象编程详细描述 ------------ ...

  5. python基础-面向对象编程

    一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 ...

  6. 面向对象编程(OOP)

    什么是面向对象编程,对于面向对象编程与面向过程编程的解释随处可见,个人认为对面向对象编程解释最好的一个定义是:依赖倒转原则是面向对象编程的标志,面向对象编程是一种思想,无论使用哪一种编程语言,如果在编 ...

  7. python 学习笔记7 面向对象编程

    一.概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." ...

  8. 进击的Python【第七章】:Python的高级应用(四)面向对象编程进阶

    Python的高级应用(三)面向对象编程进阶 本章学习要点: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法 ...

  9. 进击的Python【第六章】:Python的高级应用(三)面向对象编程

    Python的高级应用(三)面向对象编程 本章学习要点: 面向对象编程介绍 面向对象与面向过程编程的区别 为什么要用面向对象编程思想 面向对象的相关概念 一.面向对象编程介绍 面向对象程序设计(英语: ...

  10. 第二章 Matlab面向对象编程基础

    DeepLab是一款基于Matlab面向对象编程的深度学习工具箱,所以了解Matlab面向对象编程的特点是必要的.笔者在做Matlab面向对象编程的时候发现无论是互联网上还是书店里卖的各式Matlab ...

随机推荐

  1. 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现)

    0.关于 为缩短篇幅,本系列记录如下: 再谈多线程模型之生产者消费者(基础概念)(c++11实现) 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现)[本文] 再谈多线程模型之生 ...

  2. 【LeetCode】339. Nested List Weight Sum 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 dfs 日期 题目地址:https://leetcod ...

  3. 【LeetCode】509. Fibonacci Number 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetc ...

  4. 【LeetCode】45. Jump Game II 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 贪心 日期 题目地址:https://leetcod ...

  5. 1336 - Sigma Function

    1336 - Sigma Function   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB S ...

  6. JS常用的获取值和设值的方法

    1. input 标签<input type="text" name="username" id="name"/> 1) 获取i ...

  7. Color Models (RGB, CMY, HSI)

    目录 概 定义 RGB CMY CMYK HSI 相互的转换 RGB <=> CMY CMY <=> CMYK CMY > CMYK CMYK > CMY RGB ...

  8. AT-GAN: A Generative Attack Model for Adversarial Transferring on Generative Adversarial Nets

    目录 概 主要内容 符号说明 Original Generator Transfer the Generator Wang X., He K., Guo C., Weinberger K., Hopc ...

  9. DEEP DOUBLE DESCENT: WHERE BIGGER MODELS AND MORE DATA HURT

    目录 概 主要内容 Effective Model Complexity(EMC) label noise data augmentation 下降方式 SGD vs Adam Adam SGD SG ...

  10. Reflection 基础知识(一)

    反射机制的定义 反射通常指在程序在运行时能够获取自身的信息. 静态语言反射 在java中使用反射的一个例子 Class<?> clazz = Class.forName("com ...