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()
}

  我的微信公衆號會發布最新文章,歡迎關注一同交流學習編程

相關文章
相關標籤/搜索