区块链技术语言(二十三)——Go语言面向对象:方法

栏目: Go · 发布时间: 6年前

内容简介:本文完,获取更多资讯,敬请关注区块链工程师。

封装是面向对象三大特性之一。封装的好处,一个是增加代码内聚性,就是将数据和对数据的操作封装在一起,提高可复用性和可维护性;还有就是信息隐藏,就是把不该暴露的信息藏起来,通过访问控制来隐藏数据,不被外界干扰。也就是说,一个对象就是一个封装了数据和操作这些数据的代码的逻辑实体。

Go语言没有封装这个名词,但它通过方法实现了封装的特性。

1

Go语言方法

方法,本质上是一个函数。与普通函数的格式有一点不同,它在关键字 func 和方法名中间加入了一个特殊的接收器类型。其格式如下:

区块链技术语言(二十三)——Go语言面向对象:方法

注:a. 接收者t的名字自定义,它可以被方法的内部内容访问;

b. 类型拥有的所有方法名都必须是唯一的,但不同的类型可以使用相同的方法名;

c. 建立在Type类型的方法,让Type类型的数据和对此数据进行的代码操作捆绑在一起,实现了封装。

1.1 结构体类型的接收者与基本类型的接收者

接收者既可以是结构体类型,也可以是基本类型。

接收者类型为结构体类型,定义的结构体和定义在结构体上的方法同属一个main包,所以方法可以直接绑定到结构体类型的接收者上。但是 Go 语言的基本类型位于builtin包,定义于main包的方法不能直接绑定在基础类型的接收者,所以必须先对基本类型声明类型别名。

1.1.1 结构体类型接收者

接收者可以被方法内部内容访问,当接收者类型为结构体类型时,方法内部也可以访问结构体的成员变量,访问格式为:

区块链技术语言(二十三)——Go语言面向对象:方法

方法的调用格式为:

区块链技术语言(二十三)——Go语言面向对象:方法

注:“变量名.方法名”被称为选择器。

区块链技术语言(二十三)——Go语言面向对象:方法

1.1.2 基本类型接收者

在使用方法之前先对基本类型声明类型别名,再使用方法。方法的调用格式为:

区块链技术语言(二十三)——Go语言面向对象:方法

注:“变量名.方法名”被称为选择器。

区块链技术语言(二十三)——Go语言面向对象:方法

1.2 值类型的接收者与指针类型的接收者

接收者是值类型:方法调用时,不论传入的对象是值类型还是指针类型,接收器都会将它们转化为值类型,在方法内部对值类型接收者进行改变,对该变量没有任何影响;

接收者是指针类型:方法调用时,不论传入的对象是值类型还是指针类型,接收器都会将它们转化为指针类型,在方法内部对指针类型接收者进行改变,对该变量有影响。

区块链技术语言(二十三)——Go语言面向对象:方法

2

方法和函数的区别

在Go语言里,方法本质上是函数,但它与普通函数还有点不同,如表1所示。

区块链技术语言(二十三)——Go语言面向对象:方法

2.1 方法和函数在传入对象方面的区别

2.1.1 接收者为值类型的方法和参数为值类型的函数的区别

函数参数为值类型,它只能接收值类型的实参;

方法的接收者为值类型,它既可以接收值类型的传入对象,也可以接收指针类型的传入对象。

区块链技术语言(二十三)——Go语言面向对象:方法

2.1.2 接收者为指针类型的方法和参数为指针类型的函数的区别

函数参数为指针类型,它只能接收指针类型的实参;

方法的接收者为指针类型,它既可以接收值类型的传入对象,也可以接收指针类型的传入对象。

区块链技术语言(二十三)——Go语言面向对象:方法

2.2 多个方法和多个函数在是否可以同名方面的区别

接收者类型不同,方法名可以相同,即相同名字的方法可以定义在不同的类型上。但是一个程序不能有两个相同名字的函数。

区块链技术语言(二十三)——Go语言面向对象:方法

3

方法值和方法表达式

方法的调用除了“对象变量名.方法名(参数)”这种形式以外,还有另外两种表现形式:方法值和方法表达式。

3.1 方法值

方法调用的一种表现形式是方法值,即选择器作为一个值赋值给一个变量。此时这个变量是一个函数类型变量,它把方法绑定到接收者。函数只需提供实参而不需要提供接收者就能够调用。

区块链技术语言(二十三)——Go语言面向对象:方法

3.2 方法表达式

方法调用的另一种形式是方法表达式,如表2所示。

区块链技术语言(二十三)——Go语言面向对象:方法

注:a.引用的方法表达式被还原成为普通函数样式,将此表达式赋值给一个变量,调用时接收者是第一个参数,必须显式传参。

b. 若方法接收器类型是值类型:当方法表达式中的类型是值类型T,方法表达式调用 时,接收者也必须是值类型p;当方法表达式中的类型是指针类型(*T),方法表达式调用时,接收者也必须是指针&p;

c. 若方法接收器类型是指针类型:方法表达式中的类型只能是指针类型(*T),方法表达式调用时,接收者必须是指针&p。

区块链技术语言(二十三)——Go语言面向对象:方法

4

方法的延迟调用

defer不仅限于函数的调用,也可以用于方法的延迟调用。

区块链技术语言(二十三)——Go语言面向对象:方法

原文链接:区块链技术语言(二十三)——Go语言面向对象

参考资料

[1] 许式伟,吕桂华.Go语言编程[M].北京:人民邮电出版社,2012:62-67.

[2] 谭浩强.C++面向对象程序设计[M]. 清华大学出版社,2006

[3] 陈维兴,陈昕.C++面向对象程序设计[M]. 人民邮电出版社,2010

本文完,获取更多资讯,敬请关注区块链工程师。

区块链技术语言(二十三)——Go语言面向对象:方法

来源:链块学院

本文由布洛克专栏作者发布,代表作者观点,版权归作者所有,不代表布洛克科技观点

——TheEnd——

关注“布洛克科技”

区块链技术语言(二十三)——Go语言面向对象:方法


以上所述就是小编给大家介绍的《区块链技术语言(二十三)——Go语言面向对象:方法》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Python语言程序设计

Python语言程序设计

[美]梁勇(Lang Y. D.) / 李娜 / 机械工业出版社 / 2015-4 / 79.00元

本书采用“问题驱动”、“基础先行”和“实例和实践相结合”的方式,讲述如何使用Python语言进行程序设计。本书首先介绍Python程序设计的基本概念,接着介绍面向对象程序设计方法,最后介绍算法与数据结构方面的内容。为了帮助学生更好地掌握相关知识,本书每章都包括以下模块:学习目标,引言,关键点,检查点,问题,本章总结,测试题,编程题,注意、提示和警告。 本书可以作为高等院校计算机及相关专业Py......一起来看看 《Python语言程序设计》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具