#### 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() }
我的微信公衆號會發布最新文章,歡迎關注一同交流學習編程