文档章节

Golang的方法集继承规则示例

 普罗旺斯的啊
发布于 2016/11/12 11:16
字数 1131
阅读 20
收藏 0
点赞 0
评论 0

  Golang的方法集继承规则示例

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

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

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

  

 

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

  0x00 简单method的规则

  首先,我们声明示例的基本操作结构体。

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

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

  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

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 7
码字总数 6339
作品 0
郑州
golang面试题解析

最近在很多地方看到了golang的面试题,看到了很多人对Golang的面试题心存恐惧,也是为了复习基础,我把解题的过程总结下来。 面试题 1. 写出下面代码输出内容。 package main import ( "fmt...

梦朝思夕
2017/07/21
0
0
『Go 语言学习专栏』-- 第四期

大家好,我是谢伟,是一名程序员。 本专栏的主旨是:梳理 Golang 知识,力求从初级水平提升至中级水平。 同时将一些符合人性的编程经验和好的编程方法,分享给大家。 希望对大家有帮助。 本节...

谢小路
05/10
0
0
golang面向对象思想和实现

golang中并没有明确的面向对象的说法,实在要扯上的话,可以将struct比作其它语言中的class。 类声明 这样就声明了一个类,其中没有public、protected、private的的声明。golang用另外一种做...

平凡之路
2016/07/13
18
0
go语言: 设计模式-代理模式(Go语言描述)

go语言: 设计模式-代理模式(Go语言描述) 深入Django ORM的继承关系 java: [HackerRank] Diagonal Difference Go: Go语法规范点 golang: GOLANG 中HTTP包默认路由匹配规则阅读笔记 给 Python...

d_watson
2016/05/31
37
0
golang入门学习笔记(四)

作者: 一字马胡 转载标志 【2017-11-25】 更新日志 日期 更新内容 备注 2017-11-25 新建文章 go语言入门学习笔记(四) golang入门学习笔记系列 golang入门学习笔记(一) golang入门学习笔...

一字马胡
2017/11/25
0
0
Go圣经-学习笔记之封装还是组合

上一篇 Go圣经-学习笔记之方法 下一篇 Go圣经-学习笔记之方法值和表达式 通过结构体嵌入扩展类型 在前面文章中,已经介绍了结构体中的匿名成员。今天我们介绍下对象的行为集扩展。 上面的p对...

cdh0805010
2017/10/26
0
0
Go语言学习笔记(四)结构体struct & 接口Interface & 反射reflect

加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套; go中的struct类型理解为类,可以定义...

xumaojun
03/12
0
0
《Golang 入门系列五》golang的常量、变量、数组

前言:本文主要介绍常量和变量的使用,以及关于变量的可见性规则、引用类型和值类型的区别。 一、常量 常量表达式的值在编译期计算,而不是在运行期。常量的值不可修改,这样可以防止在运行期...

IT--小哥
03/11
0
0
三十岁老男人学编程之--02_语言基础

吐嘈: 学习语言最好的资料不是《XX宝典》,也不是《XXX入门到精通》,更不是百度上零零散散的文章。我认为最好的学习资料是该语言的语言规范。golang中文版语言规范参考 http://studygolang...

张国凯
2016/03/24
116
0
golang: beego自动化部署

springboot: springboot+mongodb+docker实例 golang: beego自动化部署 数据库管理平台NetopGO简介 Go语言开发 Go语言圣经(中文版) Go语言(golang)开源项目大全 Go语言诞生5周年!10大Go语言...

d_watson
2016/05/20
233
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

面试宝典-什么是缓存穿透?

缓存穿透是说收到了一个请求,但是该请求缓存里没有,只能去数据库里查询,然后放进缓存。 这里面有两个风险,一个是同时有好多请求访问同一个数据,然后业务系统把这些请求全发到了数据库;...

suyain
8分钟前
0
0
vue基础知识练习2

一、发送AJAX请求 <div id="demo1"><button @click="send">发送AJAX请求</button><button @click="sendGet">GET方式发送AJAX请求</button><button @click="sendPost">POST方式发送A......

一个yuanbeth
10分钟前
0
0
Xamarin Essentials教程磁力计Magnetometer

Xamarin Essentials教程磁力计Magnetometer 磁力计也叫地磁、磁感器,可用于测试磁场强度和方向。在手持设备中,通过磁力计可以计算设备的左右、前后倾斜角度,广泛应用于手机各种的应用中。...

大学霸
14分钟前
0
0
mesos:Authentication timed out

最近当slave开始慢慢部署异地集群的时候又碰上了这个问题 I0717 10:27:11.695762 28852 slave.cpp:895] New master detected at master@192.168.2.161:5050I0717 10:27:11.695811 28852 sl......

xueyi28
21分钟前
0
0
赋予用户库的读写权限

1、创建用户 CREATE USER 'test'@'%' IDENTIFIED BY '15ht46389012t'; #'%' - 所有情况都能访问;‘localhost’ - 本机才能访问;’192.168.1.2‘ - 指定 ip 才能访问 2、赋予权限 grant al...

xixingzhe
21分钟前
0
0
Spring核心——JSR250与资源控制

JSR-175与元编程 要说明JSR-250先要解释清楚JSR-175,要解释清楚JSR就的先了解JCP是什么。网上资料很多,就不细说了,简单的说JCP(Java Community Process)是管理Java生态(包括J2SE、J2E...

随风溜达的向日葵
22分钟前
2
0
Java面试基础篇——第五篇:类的实例化顺序

类的实例化顺序:包括 1.父类静态数据,构造函数,字段;2.子类静态数据,构造函数,字段等, 当我们new一个对象的时候,类实例化的顺序是怎么样的呢? OK.还是上代码比较实在(我就是个实在...

developlee的潇洒人生
23分钟前
0
0
引入mui.css出现闪屏问题

自己写的选项卡切换功能,引入了mui.css样式,当我切换选项卡时,页面会出现闪动,当我把mui.css注释掉后页面就不会出现闪动问题,由于mui.css文件太大,我也不知道什么属性引起的闪屏,所以...

爱喝水的小熊
27分钟前
1
0
大家都在学的编程语言 Python,可以用来干什么?

编者按:Python因为简单全面易用而成为近年来大热的编程语言。但是很多人学习了这门余元的语法和基本功能之后却不知道Python能干什么以及怎么做。Realpython.com上面的一篇文章于是把Python可...

Python燕大侠
42分钟前
2
0
学习大数据必备的5大核心技术,你知道几个?需要掌握哪些知识?

大数据已经成为时代发展的趋势,很多人纷纷选择学习大数据,想要进入大数据行业。大数据技术体系庞大,包括的知识较多,系统的学习大数据可以让你全面掌握大数据技能。学习大数据需要掌握哪些...

董黎明
53分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部