GO语言模拟C++封装,继承,多态 不携带MAP结构packagemainimportfmt// // 1. 基类父类Animal// // Animal 定义一个动物基类// 小写字段私有包外无法访问实现封装typeAnimalstruct{namestring// 动物名称ageint// 年龄}// NewAnimal 基类构造函数推荐写法funcNewAnimal(namestring,ageint)*Animal{returnAnimal{name:name,age:age,}}// Speak 父类方法可被重写func(a*Animal)Speak(){fmt.Printf([Animal] %s 发出了声音\n,a.name)}// GetName Name getter访问私有字段func(a*Animal)GetName()string{returna.name}// GetAge Age getterfunc(a*Animal)GetAge()int{returna.age}// SetAge 设置年龄封装私有字段修改func(a*Animal)SetAge(ageint){ifage0{a.ageage}}// // 2. 子类Dog继承 Animal// // Dog 子类嵌套 Animal 实现继承typeDogstruct{Animal// 匿名字段 继承Go 推荐组合式继承breedstring// 品种独有属性}// NewDog 子类构造函数funcNewDog(namestring,ageint,breedstring)*Dog{returnDog{Animal:*NewAnimal(name,age),// 调用父类构造breed:breed,}}// Speak 重写父类方法多态func(d*Dog)Speak(){// 如果想调用父类方法d.Animal.Speak()fmt.Printf([Dog] %s 汪汪叫品种%s\n,d.GetName(),d.breed)}// WagTail 子类独有方法func(d*Dog)WagTail(){fmt.Printf([Dog] %s 正在摇尾巴~\n,d.GetName())}// // 3. 另一个子类Cat演示多态// typeCatstruct{Animal colorstring}funcNewCat(namestring,ageint,colorstring)*Cat{returnCat{Animal:*NewAnimal(name,age),color:color,}}func(c*Cat)Speak(){fmt.Printf([Cat] %s 喵喵叫颜色%s\n,c.GetName(),c.color)}// // 4. 接口定义多态规范// typeAnimalSoundinterface{Speak()// 只要实现 Speak() 就算这个接口}// // 主函数使用类// funcmain(){fmt.Println( 1. 创建父类 )animal:NewAnimal(小生物,2)animal.Speak()fmt.Println(\n 2. 创建子类 Dog )dog:NewDog(旺财,3,金毛)dog.Speak()// 调用重写方法dog.WagTail()// 调用子类独有方法dog.SetAge(4)// 调用父类方法fmt.Println(修改后年龄,dog.GetAge())fmt.Println(\n 3. 创建子类 Cat )cat:NewCat(咪咪,2,白色)cat.Speak()fmt.Println(\n 4. 多态调用接口 )animals:[]AnimalSound{dog,cat}for_,a:rangeanimals{a.Speak()// 自动调用各自重写的方法}}携带MAP结构packagemainimport(fmtsync)// // 1. 基础类动物// typeAnimalstruct{namestringageint}funcNewAnimal(namestring,ageint)*Animal{returnAnimal{name:name,age:age}}func(a*Animal)Speak(){fmt.Printf(【%s】 %d岁\n,a.name,a.age)}func(a*Animal)GetName()string{returna.name}// // 2. 核心动物管理类// ✅ map 直接写在类里面// ✅ 锁也写在类里面// ✅ 全部私有外部无法乱改//// typeAnimalManagerstruct{// map 是类的内部成员完全封装animalMapmap[string]*Animal// 锁也属于类和 map 绑定lock sync.RWMutex}// 构造函数必须初始化 mapfuncNewAnimalManager()*AnimalManager{returnAnimalManager{animalMap:make(map[string]*Animal),// 类内部初始化}}// ------------------------------// 类的方法操作内部 map// 外部只能通过方法调用// ------------------------------func(m*AnimalManager)Add(animal*Animal){m.lock.Lock()deferm.lock.Unlock()m.animalMap[animal.GetName()]animal}func(m*AnimalManager)Get(namestring)*Animal{m.lock.RLock()deferm.lock.RUnlock()returnm.animalMap[name]}func(m*AnimalManager)Delete(namestring){m.lock.Lock()deferm.lock.Unlock()delete(m.animalMap,name)}func(m*AnimalManager)ShowAll(){m.lock.RLock()deferm.lock.RUnlock()fmt.Println(\n 类内部 map 全部动物 )for_,animal:rangem.animalMap{animal.Speak()}}// // 主函数使用这个类// funcmain(){// 1. 创建管理类内部自带 map 锁manager:NewAnimalManager()// 2. 创建动物a1:NewAnimal(旺财,3)a2:NewAnimal(咪咪,2)a3:NewAnimal(小鸟,1)// 3. 交给类管理存入类内部的 mapmanager.Add(a1)manager.Add(a2)manager.Add(a3)// 4. 查看所有遍历类内部 mapmanager.ShowAll()// 5. 获取一个animal:manager.Get(旺财)ifanimal!nil{fmt.Println(\n找到)animal.Speak()}// 6. 删除manager.Delete(小鸟)fmt.Println(\n删除后)manager.ShowAll()}