码迷,mamicode.com
首页 > 其他好文 > 详细

Go:面向"对象"

时间:2019-05-28 21:09:04      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:结构   targe   style   模式   大写   另一个   ref   round   ring   

一、封装

  1. 封装的实现步骤:
  2. 将结构体、字段的首字母小写(不能被导出);
  3. 给结构体所在的包提供一个工厂模式的函数,首字母大写。类似一个构造函数;
  4. 提供一个首字母大写的方法,由于获取结构体属性的值。

二、继承

在 golang 中,如果一个结构体嵌套了另一个匿名结构体,那么这个结构体可以直接访问匿名结构体的字段和方法,从而实现了继承。

type Animal struct {
	Name string
	Age int
}

type TaiDi struct {
	Animal // 这就是嵌套匿名结构体Animal
}

func (a *Animal) Eat() {
	fmt.Printf("%s今年%d岁,它正在吃东西...", a.Name, a.Age)
}

func main() {
	var td TaiDi
	td.Animal.Name = "泰迪"
	td.Animal.Age = 1
	// 可以简化成
	// td.Name = "泰迪"
	// td.Age = 1
	td.Eat()
}

如果结构体和匿名结构体有相同的字段或者方法时,编译器采用就近原则访问,如果希望访问匿名结构体的字段或方法,可以通过匿名结构体来区分。

type B struct {
	Name string
}

type C struct {
	Name string
	A
	B
}

func (a *A) Eat() {
	fmt.Printf("%s正在吃饭...\n", a.Name) // AA正在吃饭...
}

func (b *B) Eat() {
	fmt.Printf("%s正在吃饭...\n", b.Name) // 正在吃饭...
}

func main() {
	var c C
	c.Name = "CC"
	c.A.Name = "AA"
	c.A.Eat()
	c.B.Eat()
}

如果一个结构体嵌套了一个有名结构体,这种模式就是组合,如果是组合关系,那么在访问组合的结构体的字段或方法时,必须带上这个结构体的名字。

type A struct {
	Name string
}

type B struct {
	a A
}

func (a *A) Eat() {
	fmt.Printf("%s正在吃饭...\n", a.Name) // 佩奇正在吃饭...
}

func main() {
	var b B
	// b.Name = "佩奇" ,会报错,必须指定有名结构体的名字,如下
	b.a.Name = "佩奇"
	b.a.Eat()
}

四、多态

在学习多态之前,先学习接口

 

Go:面向"对象"

标签:结构   targe   style   模式   大写   另一个   ref   round   ring   

原文地址:https://www.cnblogs.com/believepd/p/10940212.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!