zoukankan      html  css  js  c++  java
  • 区块链技术语言(二十三)——Go语言面向对象:方法

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

    一、Go语言方法


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

    注:

    a. 接收者t的名字自定义,它可以被方法的内部内容访问;
    b. 类型拥有的所有方法名都必须是唯一的,但不同的类型可以使用相同的方法名;
    c. 建立在Type类型的方法,让Type类型的数据和对此数据进行的代码操作捆绑在一起,实现了封装。
    1.1 结构体类型的接收者与基本类型的接收者

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

    1.1.1 结构体类型接收者

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

    方法的调用格式为:

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

    1.1.2 基本类型接收者

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

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


    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;
    c. 若方法接收器类型是指针类型:方法表达式中的类型只能是指针类型(*T),方法表达式调用时,接收者必须是指针&p。

    四、方法的延迟调用

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

    参考资料
    [1] 许式伟,吕桂华.Go语言编程[M].北京:人民邮电出版社,2012:62-67.
    [2] 谭浩强.C++面向对象程序设计[M]. 清华大学出版社,2006
    [3] 陈维兴,陈昕.C++面向对象程序设计[M]. 人民邮电出版社,2010

  • 相关阅读:
    SQL: 返回刚插入记录的ID 及 output 更新记录时得到更新记录的ID值 .
    asp.net 用伪静态修改webconfig配置文件 .
    Asp.Net : 捕捉和记录网站中出现的所有未处理错误,抛出详细的页面来源和访问ip,调用的接口方法及异常实例(记事本日志,系统日志及数据库日志)
    js闭包(转载) (jquery ajax 异步 多循环运用 )
    c# enum 枚举名称和ID 互换获取.................
    WCF :服务开发与调用的完整示例
    关于DataSet 、 DataTable 、 ArrayList 、 IList 、Array
    Expression Tree不完全入门
    WF4 Beta2:IExecutionProperty的使用
    Groovy 1.8.9, 2.0.7 和 2.1.1 发布
  • 原文地址:https://www.cnblogs.com/efish/p/go-language-Object-Oriented-method.html
Copyright © 2011-2022 走看看