#### 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 面向对象编程应用的更多相关文章

  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. 移动端点击a标签拨打电话、发送短信

    拨打电话 <a href="tel:88888888">888888</a> 发送短信 <a href="sms:电话号码"> ...

  2. 利用免费二维码API自动生成网址图片二维码

    调用第三方接口生成二维码 官方地址:http://goqr.me/api/ 示例 https://api.qrserver.com/v1/create-qr-code/?size=180x180&am ...

  3. Qt之QListView和QStandardItemModel用法

    note 个人理解, QListView 用于 显示数据,而数据的逻辑维护则由 QStandardItemModel 完成. QStandardItemModel 创建 if (nullptr == ...

  4. 【LeetCode】800. Similar RGB Color 解题报告(C++)

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

  5. 记一次引入Elasticsearch的系统架构实战

    前言 我曾经面试安踏的技术岗,当时面试官问了我一个问题:如果你想使用某个新技术但是领导不愿意,你怎么办? 对于该问题我相信大家就算没有面试被问到过,现实工作中同事之间的合作也会遇到. 因此从我的角度重 ...

  6. Codeforces 777E:Hanoi Factory(贪心)

    Of course you have heard the famous task about Hanoi Towers, but did you know that there is a specia ...

  7. Go package(3):io包介绍和使用

    IO 操作的基本分类 在计算机中,处理文件和网络通讯等,都需要进行 IO 操作,IO 即是 input/ouput,计算机的输入输出操作. Go语言中的 IO 操作封装在如下几个包中: io 为 IO ...

  8. 浏览器Cookie无法删除问题

    1.写Cookie时添加路径: //写cookies,设置过期时间为30天,并设置path为根目录 function setPathCookie(name,value) { var Days = 30 ...

  9. 使用 jQuery 实现页面背景色的更换,通过下拉框选择对应的颜色,页面背景会随着选中的颜色进行更换

    查看本章节 查看作业目录 需求说明: 使用 jQuery 实现页面背景色的更换,通过下拉框选择对应的颜色,页面背景会随着选中的颜色进行更换 实现思路: 在页面中添加 <select> 标签 ...

  10. JUC之Callable接口回顾和JUC辅助类

    Callable接口和JUC辅助类 Callable接口: 回顾: 创建线程的四种方式: 继承Thread 实现runnable接口 实现callable接口 使用线程池 之前的文章:多线程编程1-定 ...