时间:2023-06-16|浏览:194
用戶喜愛的交易所
已有账号登陆后会弹出下载
虽然Go语言没有专门的封装术语,但通过方法的使用,可以实现封装的特性。
一、Go语言方法
方法本质上是一个函数。与一般函数的语法格式有所不同,方法在func关键字和方法名之间添加了一个独特的信号接收器类型。其语法格式如下:
func (t Type) methodName() { //方法内容 }
注意:
a. 接收器t的名称可以自定义,它可以在方法的内部结构中具体浏览。
b. 对于一个类型,拥有的全部方法名必须是唯一的,但不同类型可以采用相同的方法名。
c. 创建在Type类型上的方法,将Type类型和对于此数据信息开展的编码实际操作绑定在一起,达到了封装的目的。
1.1 结构体类型的接收器和基本类型的接收器
接收器可以是结构体类型,也可以是基本类型。
当接收器类型为结构体类型时,定义在结构体上的方法和结构体所在的main包同属于一个作用域,因此方法可以同时关联到结构体类型的接收器上。
而Go语言的基本类型位于builtin包,因此方法不可以直接关联在基本类型的接收器上,必须先向基本类型声明类型别名。
1.1.1 结构体类型的接收器
当接收器类型为结构体类型时,方法内部结构可以访问结构体的成员变量。访问的语法格式如下:
t.variableName
方法的调用格式如下:
variableName.methodName()
注意:“变量定义.方法名”被称为选择器。
1.1.2 基本类型的接收器
在使用方法之前,需要先声明基本类型别名,然后才能使用方法。方法的调用格式如下:
variableName.methodName()
注意:“变量定义.方法名”被称为选择器。
1.2 值类型接收器和指针类型接收器
接收器可以是值类型或指针类型。
如果接收器是值类型,则在方法调用时,无论传递的参数是值类型还是指针类型,信号接收器都会把它们转换成值类型,对值类型接收器进行更改不会影响参数本身。
如果接收器是指针类型,则在方法调用时,无论传递的参数是值类型还是指针类型,信号接收器都会把它们转换成指针类型,对指针类型接收器进行更改会影响参数本身。
二、方法和函数的差异
在Go语言中,方法本质上是一种函数,但它与普通函数有所不同,如表1所示。
2.1 方法和函数在目标层面的区别
2.1.1 接收器是值类型的方法和参数是值类型的函数
函数的参数是值类型,只能接受值类型的实参;
方法的接收器是值类型,可以接受值类型和指针类型的实参。
2.1.2 接收器是指针类型的方法和参数是指针类型的函数
函数的参数是指针类型,只能接受指针类型的实参;
方法的接收器是指针类型,可以接受值类型和指针类型的实参。
2.2 多个方法和多个函数的命名方案
方法名可以相同,但只能在不同类型上定义。在一个程序中,不允许有多个同名函数。
三、方法值和方法表达式
除了使用“变量名.方法名(参数)”的方式调用方法之外,还可以使用方法值和方法表达式两种方式启用方法。
3.1 方法值
方法值是一种方法调用语法,通过将方法表达式用作值获取函数类型的变量。这个变量可以在不需要接收器的情况下调用方法。
3.2 方法表达式
方法表达式是一种函数调用语法,如表2所示。
注意:
a. 引入的方法表达式被还原为常规函数形式,将此表达式的值分配给变量后,可以通过显式传递参数来使用函数。
b. 如果方法的接收器类型是值类型,则方法表达式中的类型必须是值类型T,方法表达式启动时,接收器也必须是值类型p;如果方法的接收器类型是指针类型,则方法表达式中的类型只能是指针类型*T,方法表达式启动时,接收器也必须是指针类型&p。
四、延迟方法调用
defer不仅适用于函数调用,也可用于方法的延迟调用。
参考文献:
[1]许式伟,吕桂华。< [2]谭浩强。< [3]陈维兴,陈昕。< -END- 链块学校网课学习服务平台链接:http://wk.liankuai.tech/ 助课通讯卫星:lkxy007