类的表示
表示一个类以及一个方法的方式为:结构体 + 方法
type Hero struct {Name stringAd intLevel int}// 必须用 *Hero 类型,否则初始化的是一个Hero临时对象func (h *Hero) SetName(newName string) {h.Name = newName}// 最好也用 * 类型,可免去拷贝开销func (h *Hero) GetName() string {return h.Name}
封装
结构体名、结构体元素名或者方法名的首字母大写,则其他包也能够访问,否则只能在本包中访问。
这也恰好解释了为什么使用fmt.Println()时P要大写了!
继承模拟
go 没有继承,但是可以用语法糖模拟继承。
type Human struct {name stringsex string}func (h Human) Run() {fmt.Println(h.name, "is running")}type SuperMan struct {Human // SuperMan类继承了Human类的方法level int}func main() {var s SuperMans.name = "li4" // 语法糖,等价于 s.Human.names.sex = "male"s.level = 88s.Run() // 语法糖,等价于 s.Human.Run()}
多态模拟
什么是多态?
相同的消息发送给不同的对象,系统根据对象所属类别,引发不同对象产生不同的行为。
golang如何实现多态?
使用 接口 + 结构体 方法来实现多态。
比如定义一个 Animal 有 eat() 和 color() ,通过不同的结构体实现 eat() 和 color() 来定义不同的动物,且具有不同的 eat() 和 color() 实现方式。接口的数据类型为父类指针。
type Animal interface {eat()}type Cat struct {Name string}type Dog struct {Name string}func (c *Cat) eat() {fmt.Println("cat " + c.Name + " is eating fish")}func (d *Dog) eat() {fmt.Println("dog " + d.Name + " is eating bone")}// animal的本质是一个指针func showAnimal(animal Animal) {animal.eat()}func main() {var animal Animal // 接口的数据类型为“父类指针”animal = &Cat{"FuGui"}animal.eat()animal = &Dog{"WangCai"}animal.eat()cat := Cat{"FuGuiPig"}showAnimal(&cat)}
