• GO语言基础之method


    方法 method

      1. Go 中虽没有 class,但依旧有 method

      2. 通过显示说明 receiver 来实现与某个类型的组合

      3. 只能为同一个包中的类型定义方法

      4. Receiver 可以是类型的值或者指针

      5. 不存在方法重载

      6. 可以使用值或指针来调用方法,编译器会自动完成转换

      7. 从某种意义上来说,方法是函数的语法糖,因为 receiver 其实就是方法所接收的第1个参数(Method Value vs. Method Expression)

      8. 如果外部结构和嵌入结构存在同名方法,则优先调用外部结构的方法

      9. 类型别名不会拥有底层类型所附带的方法

      10. 方法可以调用结构中的非公开字段

    复制代码
    package main
    
    import "fmt"
    
    type A struct {
        Name string
    }
    
    type B struct {
        Name string
    }
    
    //引用传递得道到是指针到拷贝,修改会同步修改结构体内到内容
    func (a *A) Print() {
        a.Name = "AA"
        fmt.Println("A")
    }
    
    //值传递只是得到结构体内容到拷贝
    func (b B) Print()  {
        b.Name = "BB"
        fmt.Println("B")
    }
    
    func main() {
        a := A{}
        a.Print()
        fmt.Println(a.Name)
    
        b := B{}
        b.Print()
        fmt.Println(b.Name)
    }
    复制代码

    运行结果:

    1
    2
    3
    4
    A
    AA
    B
    <空字符串>

     Go 还有一个特别灵活的地方,就是它可以为任何一个声明类型绑定定义一个方法,如下:

    复制代码
    package main
    
    import "fmt"
    
    /**
    Go到一个灵活到地方就是可以为type声明到任何类型绑定一个方法
    例如下面到例子,定义了类型为整型到变量Va,为其绑定一个输出函数并在主方法中调用
     */
    type Va int
    
    func (a *Va) Print() {
        fmt.Println("Va")
    }
    
    func main() {
        var a Va
        a.Print()
    }
    复制代码

    运行结果:

    Va

    说明:这里需要说明一点,结构体内部声明的变量首字母大小写是决定不同包之间的调用时公开的还是私有的,而在同一个包下,即使是小写的也是可以被调用到的。

      以上说了这么多,相信有很大一部分人觉得很乱,不一会函数不一会方法 method 的,感觉这两者都一样啊,那为什么还这么费劲的分开讲呢?这块对于初学者来说却是很容易混淆,简单的可以从以下两方面考虑:

      1.对于普通函数,接收者为值类型时,不能将指针类型的数据直接传递,反之亦然。

      2.对于方法(如struct的方法),接收者为值类型时,可以直接用指针类型的变量调用方法,反过来同样也可以。

      说人话就是:方法(method)与对象相关,函数(func)与对象无关,其实区别不大.有时需要面向对象思想时用方法名喽.method是绑定到了具体struct上了,而func就是简单的一个函数。

      还有不理解的?收到有的同学的提问,我就只好再啰嗦一句更加人话的人话:

        method是附属在一个给定的类型上的,他的语法和函数的声明语法几乎 一样,只是在 func 后面增加了一个receiver(也就是method所依从的主体)。非得让我举例子吗,那好吧,我妥协了,看一下下面的例子吧:

    复制代码
    // 定义了一个矩形结构体
    type Rectangle struct {
        width, height float64
    }
    
    /*
      这里就是函数即func,其声明: func funcName(parameters) (results) */ func area(r Rectangle) float64 { return r.width*r.height } /*
      这里就是方法即method,其声明: func (r ReceiverType) funcName(parameters) (results) */ func (r Rectangle) area() float64 { return r.width*r.height }
    复制代码
  • 相关阅读:
    BZOJ1264 [AHOI2006]基因匹配Match 动态规划 树状数组
    BZOJ1845 [Cqoi2005] 三角形面积并 扫描线 计算几何
    BZOJ1258 [CQOI2007]三角形tri 模拟
    BZOJ4972 八月月赛 Problem B 小Q的方格纸 二维前缀和
    BZOJ1218 [HNOI2003]激光炸弹 二维前缀和
    BZOJ1263 [SCOI2006]整数划分 高精度
    BZOJ1209 [HNOI2004]最佳包裹 三维凸包 计算几何
    BZOJ1207 [HNOI2004]打鼹鼠 动态规划
    BZOJ1202 [HNOI2005]狡猾的商人 spfa
    BZOJ1201 [HNOI2005]数三角形 大力出奇迹
  • 原文地址:https://www.cnblogs.com/grimm/p/7575986.html
Copyright © 2020-2023  润新知