package main import "fmt" // Hero 定义父类 type HeroA struct { name string age int } // HeroMan 定义子类 type HeroMan struct { HeroA //HeroMan 里直接写了一个 HeroA,这叫匿名字段,也可以理解为 Go 里的组合式继承。HeroMan 并没有真正继承 HeroA,而是把 HeroA 作为自己的一个字段嵌进去了。 level int } // 字义子类打印函数 func (this *HeroMan) Print() { //this 只是接收者名字,和 Java、C++ 里的 this 概念类似,但在 Go 里你可以随便命名,比如写成 h *HeroMan 也可以 //因为 HeroA 是匿名字段,所以 HeroMan 可以直接访问它的字段: fmt.Println("name:", this.name) // 等价于 this.HeroA.name fmt.Println("age:", this.age) // 等价于 this.HeroA.age fmt.Println("level:", this.level) // HeroMan 自己的字段 //也就是说,HeroMan 拥有了 HeroA 的字段,但本质上仍然是组合关系 } // NewHeroMan 工厂函数封装初始化简化复杂结构创建: // 这个函数用来简化 HeroMan 的创建过程。 // 它接收 name、age、level,然后返回一个 *HeroMan 指针。 // &HeroMan{HeroA{name, age}, level} 的意思是: // 先构造一个 HeroA{name, age} // 再把它放进 HeroMan 的第一个字段 // level 是 HeroMan 自己的字段 // 这种写法在 Go 里很常见,尤其是结构体字段较多时,用工厂函数可以避免每次手写复杂的初始化结构。 func NewHeroMan(name string, age int, level int) *HeroMan { return &HeroMan{HeroA{name, age}, level} } type Skiller interface { UseSkill() string } func (h *HeroMan) UseSkill() string { return fmt.Sprintf("%s 释放战士技能", h.name) } // HeroMan 和 HeroMage 都嵌入了 HeroA,但它们各自实现了 UseSkill()。所以它们都满足 Skiller 接口。 type HeroMage struct { HeroA mana int } func (h *HeroMage) UseSkill() string { return fmt.Sprintf("%s 释放法师技能", h.name) } func CastSkill(s Skiller) { fmt.Println(s.UseSkill()) } func main() { hero := NewHeroMan("zhangs", 10, 100) mage := &HeroMage{HeroA: HeroA{name: "lisi", age: 20}, mana: 200} CastSkill(hero) // *HeroMan 满足 Skiller CastSkill(mage) // *HeroMage 满足 Skiller //同一个 CastSkill 函数,接收的是 Skiller 接口,但传入不同结构体时,执行的是各自的 UseSkill() 实现。这就是多态。 return //第一种继承方式: //这里直接用结构体字面量创建 HeroMan: //HeroA{name: "zhangs", age: 10} 是内嵌字段 //100 是 level //注意这里 HeroA 使用了字段名初始化,而外层 HeroMan 使用的是位置顺序初始化。 h := HeroMan{HeroA{name: "zhangs", age: 10}, 100} h.Print() fmt.Println("=============") //第二种继承方式: //这里先声明了一个零值结构体 s,然后逐个赋值。 //因为 HeroA 是匿名字段,所以 s.name、s.age 可以直接访问。 var s HeroMan s.name = "lisi" s.age = 20 s.level = 200 s.Print() fmt.Println("=============") //第三类方法,组合后使用工厂函数 //这里调用前面定义的工厂函数,返回的是 *HeroMan 指针。 y := NewHeroMan("lisi", 100, 200) y.Print() }golang结构体学习笔记(二)
张小明
前端开发工程师
2026年AI漫剧制作工具对比:哪款算真正的一站式工作台?
Meta描述: 2026年AI漫剧制作工具怎么选?本文从一站式工作台的四个判断标准出发,对比知漫剧、即梦、可灵、小云雀、豆包、LibTV,附两个差异化对比表格与常见问题,帮新手看清谁才是真正的全流程方案。 开篇首段 2026年…
运动补剂别盲目选!看懂全产业链实力才不踩坑
随着全民健身理念普及,运动营养市场规模持续扩容,市面上各类蛋白粉、肌酸、氨基酸补剂层出不穷。很多消费者选购时只看产品宣传、网红推荐,忽略品牌背后的产业链能力,容易买到配方粗糙、原料来源不明、品控薄弱的产品。运动营养全…
格式规范否?8款AI写作辅助平台榜单,毕业季救星!
论文写作是不是总让你抓耳挠腮?文献资料多得看不完,却找不到重点?格式排版反复修改,还是不达标? 别担心!AI论文写作工具正成为越来越多学生的得力助手。本文将从学术规范性、文献分析能力、查重优化效果以…
从索尼向Meta转让419项XR专利,看一场正在发生的战略分野
结论先行:索尼正在系统性地退出XR硬件战场,而Meta正在加速构筑专利护城河。这一进一退之间,折射的是两家公司对XR产业成熟度的根本性判断分歧。 一、交易的核心事实 根据美国专利商标局2026年10月5日披露的记录,索尼在2026年6月至9月期间,已向Meta转让了43项美国XR专利,…
AI 对话就能画流程图和架构图,还能二次编辑|debug996.com 实测
绘图 绘图 目录先说结论它是怎么干活的关键点:生成的图是"活的"还能把代码直接转成流程图其他几个顺手的功能适合谁用先说结论 做技术方案的都知道,画图这件事特别费时间:打开 Visio 或者 draw.io,拖框、连线、调格式&…
客户拜访记录总遗漏、复盘没头绪?实测5款转写工具,这款让销售效率翻倍!
销售朋友们,你们有没有这样的经历:一天拜访三四家客户,聊得口干舌燥,回到公司却记不清客户到底说了哪些关键需求;要么录音笔里塞满几小时的录音,却根本懒得回听,更别提整理成规范的复盘文档了。…