Golang的方法集继承规则示例

  Golang的方法集继承规则示例函数

  2016/11/11 · Go · Golang, IT技术性能

  分享到:0MongoDB集群之分片技术应用MongoDB复制集—快速搭建复制集MongoDB复制集技术内幕:工做原理及新版本改进方向MongoDB 在线讲座之如何测试、调整及监控MongoDB性能本文做者: 伯乐在线 - v7 。未经做者许可,禁止转载!测试

  欢迎加入伯乐在线 专栏做者。url

  

 

  本篇经过具体示例来展示 Golang 机制中 methods set 的继承规则。.net

  0x00 简单method的规则3d

  首先,咱们声明示例的基本操做结构体。指针

  更多阅读请点击:郑州治疗白癜风医院blog

  更多阅读请点击:郑州治疗牛皮癣医院继承

  Go接口

  1

  2

  3

  4type Cat struct{

  Name string

  Color string

  }

  咱们声明了一个 Cat 的 type,在它的基础上咱们声明一个Meow的method:

  Go

  1

  2

  3func (c Cat) Meow() {

  fmt.Println("Name:", c.Name, "Color:", c.Color)

  }

  在上面的代码上, 咱们声明了一个method, 它的receiver是Cat(区别于Cat的指针),在这时,不管是咱们经过 Cat类型的变量来调用method仍是用 *Cat的类型来调用,Go都会正常的编译并正常输出,以下图:

  

 

  如图,main函数中的 a 和 b 变量,一个是 Cat 类型,一个是Cat的指针类型,他们都有Meow方法。

  那么若是咱们声明的函数receiver是 *Cat呢?

  1

  2

  3func (c *Cat) Meow() {

  fmt.Println("Name:", c.Name, "Color:", c.Color)

  }

  在这种状况下,方法也是继承的:

  

 

  上面是简单的 Cat 和 *Cat 上的方法集的继承规则:

  普通状况下,类型 T 和 *T 上的方法集是互相继承的。

  0x01 接口中methods set的规则

  接下来咱们声明一个接口来作对比:

  1

  2

  3

  4

  5

  6

  7

  8type Meower interface{

  Meow()

  }

  func Greet(meower Meower){

  meower.Meow()

  }

  首先咱们在Cat类型上实现Meower接口:

  1

  2

  3func (c Cat) Meow(){

  fmt.Println("Name:", c.Name, " Color:", c.Color)

  }

  此时编译是没问题的

  

 

  也就是说,若是咱们给Cat类型实现Meower的接口上Meow的方法,不管是Cat仍是*Cat都是能够成为接口调用的。

  那若是咱们实现接口方式时候,选择的receiver是*Cat呢?

  1

  2

  3func (c *Cat) Meow(){

  fmt.Println("Name:", c.Name, " Color:", c.Color)

  }

  编译不经过,以下图:

  

 

  若是给指针实现Meow方法,在第26行出现了类型错误,提示咱们Meow方法的receiver是一个指针类型,说明此时方法不能继承。

  因而这里的规则是:

  在接口中的method,对于普通类型T:

  T的methods set里不会继承包含*T实现的method,除非T本身实现相对应的method。

  可是,*T会继承T的method set。

  0x02 嵌入类型中methods set的规则

  咱们讨论了上面两种状况,那考虑若是Cat做为嵌入类型(Embedded Types)时会发生什么呢?

  因而在上面的基础上,咱们来声明这样一个类型来作实验:

  1

  2

  3

  4type BlackCat struct{

  Cat

  Age int

  }

  此时咱们是直接能够经过BlackCat 来调用Cat实现的接口method的, 如图:

  

 

  上图中,咱们并无为BlackCat实现接口,仅仅为Cat实现了接口,不过BlackCat里面嵌入了Cat的一个内部类型,也是能够经过接口调用函数Greet来调用到Meow method。

  同时咱们修改main函数,发现BlackCat的methods set 里面包含了Meow(), 以下图:

  

 

  此时:

  嵌入类型的类型中,外部类型本身不曾实现的methods被携带的内部函数实现时,外部类型也会将这些methods加入到本身的methods set里。

  那么,若是外部类型BlackCat本身实现了Meow()函数(同时也实现了接口),内部和外部都实现的状况下会怎样呢?

  下面咱们给BlackCat实现Meow()方法试一下:

  1

  2

  3func (c BlackCat) Meow(){

  fmt.Println("BlackName:", c.Cat.Name, " Age:", c.Age)

  }

  首先,编译是没问题的:

  

 

  咱们看一下a.Cat.Meow() 和 a.Meow()的运行结果:

  

 

  发现BlackCat的使用了本身实现的方法,或者说它把内部Cat的Meow()方法覆盖了。

  将直接调用改为使用接口时也是如此:

  

 

  

 

  两次结果是同样的。

  0x03 结论

  搞清Golang中的方法集继承对咱们写出不啰嗦的代码颇有用处,而在Golang中,对于指针的处理也比C/C++中灵活了一些。

  0x04 参考资料

  Methods, Interfaces and Embedded Types in Go

相关文章
相关标签/搜索