Golang learning 结构体 struct 与面向对象

wangyongyue · · 801 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Go 语言并不是传统意义上的面向对象语言,但是实现很小的面向对象的机制。
匿名嵌入并不是继承,无法实现多态处理,虽然配合方法集,可用接口来实现一些类似操作,但是其本质是完全不同的。

type Animal struct {          声明Animal
    name string
    age  int
}
type Cat struct {

    Animal                       匿名字段
    teeth string  "牙"         "牙" 不是注释,字段标签(tag)不是注释,是用来描述字段的元数据,是struct的一部分
    leg  int
}
type Animal struct {                        声明Animal类
    name string
    age  int
}
type AnimalAction interface {        声明AnimalAction  接口类

    eat()                                        声明func
    voice()                                     声明func

}
func (a Animal) eat(){                  Animal实现接口AnimalAction    方法eat()

    fmt.Print("eat")
}
func (a Animal) voice(){                 Animal实现接口AnimalAction    方法voice()

    fmt.Print("voice")
}




type Cat struct {                         声明Cat类  
    Animal                                匿名字段Animal     (不可以当做继承,可以有部分功能(比如不能多态))
    teeth string "牙"
    leg  int
}

type NewAction interface {     声明NewAction  接口类
    run()
        sing(s func(name string))   声明闭包sing
}

func (c Cat) eat(){                    Cat实现 func eat(),类似继承的重写,但不是重写。 
    c.Animal.eat()                    Cat调用Animal func eat(),类似super.eat()  但不是调用父类方法
    fmt.Print("cat eat")

}
func (c Cat) run(){                    Cat实现NewAction func run()

    fmt.Print("cat run")

}
func (c Cat) sing(s func(name string)){       实现闭包sing
    s("cat")
}

func test(){


   a := Animal{
    "a",
    12,

   }
   a.eat()
   a.voice()

   c := Cat{
    Animal{
        "cat",
        1,
    },
    "尖牙",
    4,
   }

   c.eat()
   c.voice()
   c.run()

   c.sing(func(name string) {         调用闭包

      fmt.Print("\n" + name + "sing")
   })


}


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:wangyongyue

查看原文:Golang learning 结构体 struct 与面向对象

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

801 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传