热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Go面向对象编程应用

####Go面向对象编程应用前面学习了很多的基础知识,这一节来实际写一个小案例:涉及到的知识:1.数组的基本使用2.结构体3.切片4.方法5.循环6.函数返回值(命名返回值,普通返

#### 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语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
  • 面向对象之3:封装的总结及实现方法
    本文总结了面向对象中封装的概念和好处,以及在Java中如何实现封装。封装是将过程和数据用一个外壳隐藏起来,只能通过提供的接口进行访问。适当的封装可以提高程序的理解性和维护性,增强程序的安全性。在Java中,封装可以通过将属性私有化并使用权限修饰符来实现,同时可以通过方法来访问属性并加入限制条件。 ... [详细]
author-avatar
cy45vsf
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有