• Go的方法(method)


    声明形式

    在这里插入图片描述

    1. receiver参数。go中的方法必须是归属于一个类型的,而receiver参数的类型就是这个方法归属的类型,或者说这个方法就是这个类型的一个方法

    一般声明形式

    func (t *T或T) MethodName(参数列表) (返回值列表) { 
        // 方法体
    }
    
    • 1
    • 2
    • 3

    无论 receiver 参数的类型为 *T 还是 T,我们都把一般声明形式中的 T 叫做 receiver 参数 t 的基类型。如果 t 的类型为 T,那么说这个方法是类型 T 的一个方法;如果 t 的类型为 *T,那么就说这个方法是类型 *T 的一个方法。而且,要注意的是,每个方法只能有一个 receiver 参数,Go 不支持在方法的 receiver 部分放置包含多个 receiver 参数的参数列表,或者变长 receiver 参数

    receiver参数的基类型本身不能是指针类型或者接口类型

    方法声明要和receiver参数的基类型声明放在同一个包内

    1. 推论1:我们不能为原生类型(诸如int、float64、map等)添加方法
    2. 推论2:不能跨越Go包为其他包的类型声明新方法

    方法的本质

    Go语言中的方法的本质就是,一个以方法的receiver参数作为第一个参数的普通函数

    receiver参数类型对Go方法的影响

    当receiver参数的类型为T时

    当我们的方法M1采用类型为T的recevier参数时,代表T类型实例的receiver参数以值传递方式传递到M1方法体中的,实际上是T类型实例的副本,M1方法体中对副本的任何修改操作,都不会影响到原T类型实例

    当receiver参数的类型为*T时

    当我们的方法M2采用类型为*T的recevier参数时,代表*T类型实例的receiver参数以值传递方式传递到M2方法体中的,实际上是T类型实例的地址,M2方法体通过该地址可以对原T类型实例进行任何修改操作

    方法集合

    方法集合是用来判断一个类型是否实现了某接口类型的唯一手段,可以说,“方法集合决定了接口实现”

    Go语言规定,*T类型的方法集合包含所有以*T为receiver参数类型的方法,以及所有以T为receiver参数类型的方法

    选择receiver的原则

    1. 如果Go方法要把receiver参数代表的类型实例的修改,反映到原类型实例上,那么我们应该选择*T作为receiver参数的类型
    2. 如果receiver参数类型的size较大,以值拷贝形式传入就会导致较大的性能开销,这时我们选择*T作为recevier类型可能更好些
    3. T类型是否需要实现某个接口
  • 相关阅读:
    【02】基础知识:React - jsx语法规则
    通过Shell脚本自动安装Hive&JDBC测试&提供CDH5网盘地址
    Linux云服务环境安装-Redis篇
    【vue3】:Excel导入导出解决方案
    HStreamDB Newsletter 2022-07|分区模型优化、数据集成框架进一步完善
    【Docker】安装RabbitMQ
    Worthington果胶酶的特性及测定方案
    C++ 如何根据地理坐标范围获取瓦片地图并使用CImage库实现多张图片(瓦片地图)的快速合并
    如何使用摩尔信使MThings连接网络设备
    mongodb 集合复制---聚合管道操作符$out来实现
  • 原文地址:https://blog.csdn.net/lee_nacl/article/details/127811304