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

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

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

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

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语言面向对象:方法》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Data Structures and Algorithms

Data Structures and Algorithms

Alfred V. Aho、Jeffrey D. Ullman、John E. Hopcroft / Addison Wesley / 1983-1-11 / USD 74.20

The authors' treatment of data structures in Data Structures and Algorithms is unified by an informal notion of "abstract data types," allowing readers to compare different implementations of the same......一起来看看 《Data Structures and Algorithms》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具