ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

golang结构体学习笔记(二)

golang结构体学习笔记(二) 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() }
返回列表