Go 面向对象编程应用
- #### Go 面向对象编程应用
前面学习了很多的基础知识,这一节来实际写一个小案例:
涉及到的知识:
1. 数组的基本使用
2. 结构体
3. 切片
4. 方法
5. 循环
6. 函数返回值(命名返回值,普通返回值)
备注: 大家也可以在上面加入从终端获取用户信息,将方法动作根据终端选择绑定
---
案例1: 班级管理系统
1. 默认3个班级
2. 学生有姓名,年龄,所在班级属性
3. 学生可以选择加入班级,切换班级
- package main
- import (
- "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 int
- classIndex, err = searchClassByName(class)
- // 根据查找的值处理是否加入班级
- if err == nil {
- // 更改学生的班级
- s.Class = class
- CLASS[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 error
- var 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 = i
- return
- }
- }
- 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 加入Music
- var xiaoMing Student
- xiaoMing = newStudent("xiaoMing", 20)
- xiaoMing.joinClass("Music")
- xiaoMing.showInfo()
- // xiaoHu加入Music
- var xiaoHu Student
- xiaoHu = newStudent("xiaoHu", 18)
- xiaoHu.joinClass("Music")
- xiaoHu.showInfo()
- // xiaoHong 加入Math
- var xiaoHong Student
- xiaoHong.Name = "xiaoHong"
- xiaoHong.Age = 22
- xiaoHong.joinClass("Math")
- xiaoHong.showInfo()
- // xiaoHua 加入English
- xiaoHua := Student{
- Name: "xiaoHua",
- Age: 23,
- }
- xiaoHua.joinClass("English")
- xiaoHua.showInfo()
- // xiaoJia 加入不存在的班级Paint
- xiaoJia := 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()
- }
个人微信公众号会发布最新文章,欢迎关注一同交流学习
Go 面向对象编程应用的更多相关文章
- angular2系列教程(六)两种pipe:函数式编程与面向对象编程
今天,我们要讲的是angualr2的pipe这个知识点. 例子
- 带你一分钟理解闭包--js面向对象编程
上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...
- PHP 面向对象编程和设计模式 (1/5) - 抽象类、对象接口、instanceof 和契约式编程
PHP高级程序设计 学习笔记 2014.06.09 什么是面向对象编程 面向对象编程(Object Oriented Programming,OOP)是一种计算机编程架构.OOP 的一条基本原则是计算 ...
- Delphi_09_Delphi_Object_Pascal_面向对象编程
今天这里讨论一下Delphi中的面向对象编程,这里不做过多过细的讨论,主要做提纲挈领的描述,帮助自己抓做重点. 本随笔分为两部分: 一.面向对象编程 二.面向对象编程详细描述 ------------ ...
- python基础-面向对象编程
一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 ...
- 面向对象编程(OOP)
什么是面向对象编程,对于面向对象编程与面向过程编程的解释随处可见,个人认为对面向对象编程解释最好的一个定义是:依赖倒转原则是面向对象编程的标志,面向对象编程是一种思想,无论使用哪一种编程语言,如果在编 ...
- python 学习笔记7 面向对象编程
一.概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." ...
- 进击的Python【第七章】:Python的高级应用(四)面向对象编程进阶
Python的高级应用(三)面向对象编程进阶 本章学习要点: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法 ...
- 进击的Python【第六章】:Python的高级应用(三)面向对象编程
Python的高级应用(三)面向对象编程 本章学习要点: 面向对象编程介绍 面向对象与面向过程编程的区别 为什么要用面向对象编程思想 面向对象的相关概念 一.面向对象编程介绍 面向对象程序设计(英语: ...
- 第二章 Matlab面向对象编程基础
DeepLab是一款基于Matlab面向对象编程的深度学习工具箱,所以了解Matlab面向对象编程的特点是必要的.笔者在做Matlab面向对象编程的时候发现无论是互联网上还是书店里卖的各式Matlab ...
随机推荐
- 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现)
0.关于 为缩短篇幅,本系列记录如下: 再谈多线程模型之生产者消费者(基础概念)(c++11实现) 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现)[本文] 再谈多线程模型之生 ...
- 【LeetCode】339. Nested List Weight Sum 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 dfs 日期 题目地址:https://leetcod ...
- 【LeetCode】509. Fibonacci Number 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetc ...
- 【LeetCode】45. Jump Game II 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 贪心 日期 题目地址:https://leetcod ...
- 1336 - Sigma Function
1336 - Sigma Function PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB S ...
- JS常用的获取值和设值的方法
1. input 标签<input type="text" name="username" id="name"/> 1) 获取i ...
- Color Models (RGB, CMY, HSI)
目录 概 定义 RGB CMY CMYK HSI 相互的转换 RGB <=> CMY CMY <=> CMYK CMY > CMYK CMYK > CMY RGB ...
- 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 ...
- DEEP DOUBLE DESCENT: WHERE BIGGER MODELS AND MORE DATA HURT
目录 概 主要内容 Effective Model Complexity(EMC) label noise data augmentation 下降方式 SGD vs Adam Adam SGD SG ...
- Reflection 基础知识(一)
反射机制的定义 反射通常指在程序在运行时能够获取自身的信息. 静态语言反射 在java中使用反射的一个例子 Class<?> clazz = Class.forName("com ...