• 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类型是否需要实现某个接口
  • 相关阅读:
    类和对象11:描述符方法
    Gateway入门
    java:操作session
    01- 从零开始完整实现-循环神经网络RNN
    ps打开找不到MSVCP140.dll重新安装方法,安装ps出现msvcp140.dll缺失解决方法
    算法题:牛牛的三元组问题
    #力扣:344. 反转字符串@FDDLC
    java-net-php-python-s2sh教学管理平台hsg8229AGA2修改回复计算机毕业设计程序
    IO流练习 二
    Socks5代理IP在跨境电商与游戏中的应用
  • 原文地址:https://blog.csdn.net/lee_nacl/article/details/127811304