美文网首页
go 中的类与方法

go 中的类与方法

作者: 蛐蛐儿阳 | 来源:发表于2020-05-02 19:37 被阅读0次

    看下面代码

    package main
    
    import (
        "fmt"
        "math"
    )
    
    type Point struct{X, Y float64}
    // 结构体 Path的名字 可看作类的名字
    type Path []Point
    
    func Distance(p, q Point) float64 {
        return math.Hypot(q.X-p.X, q.Y-p.Y)
    }
    
    func (p Point) Distance(q Point) float64 {
        return math.Hypot(q.X-p.X, q.Y-p.Y)
    }
    
    // 仔细看下和函数有何不同
    // 是的 函数名字前多了一个扣好, 里面传入了类的名字
    // go 里面没有this, self,  直接用结构体名字代替
    // 在这里也就是 path
    func (path Path) Distance() float64 {
        sum := 0.0
        for i := range path {
            if i > 0 {
                sum += path[i-1].Distance(path[i])
            }
        }
        return sum
    }
    // path 是一个slice
    
    func main()  {
        perim := Path{
            {1,1},
            {5,1},
            {5,4},
            {1,1},
        }
        fmt.Println(perim.Distance())
    }
    
    

    得出三角形周长12. 看下我修改的代码并尝试理解

    package main
    
    import (
        "fmt"
        "math"
    )
    
    // 方法名是Point
    type Point struct{X, Y float64}
    // 结构体 Path的名字 可看作类的名字
    // 数据类型是切片
    type Path []Point
    
    // 函数
    func Distance(p, q Point) float64 {
        return math.Hypot(q.X-p.X, q.Y-p.Y)
    }
    
    //方法1
    func (p Point) Distance1(q Point) float64 {
        return math.Hypot(q.X-p.X, q.Y-p.Y)
    }
    
    // 仔细看下和函数有何不同
    // 是的 函数名字前多了一个扣好, 里面传入了类的名字
    // go 里面没有this, self,  直接用结构体名字代替
    // 在这里也就是 path
    func (path Path) Distance2() float64 {
        sum := 0.0
        for i := range path {
            if i > 0 {
                // 这里之所以能点的出来, 并不是在调用自己,
                // 而是在调用方法1
                // 这里已经重名, 但并没有报错
                // 那我如何区分用的是哪个方法呢
                // 厉害了
                sum += path[i-1].Distance1(path[i])
            }
        }
        return sum
    }
    // path 是一个slice
    
    func main()  {
        //Point.Distance1()
        //Path.Distance2()
        perim := Path{
            {1,1},
            {5,1},
            {5,4},
            {1,1},
        }
        fmt.Println(perim.Distance())
    }
    
    

    我们还是别结构体了,用类,方法好理解一些。 以上方法有两个结构体,相当于两个类。

    type Path []Point
    type Point struct{X, Y float64}
    

    分别对应的两个方法

    func (p Point) Distance1(q Point) float64 {
        return math.Hypot(q.X-p.X, q.Y-p.Y)
    }
    
    func (path Path) Distance2() float64 {}
    

    两个方法完全可以重名, 原因是 方法1是类Point的方法,方法2是Path的方法。也就是说。 go里面定义方法,必须传入类名。(结构体名称), 传入的是哪个结构体,此方法就属于哪个结构体。

    相关文章

      网友评论

          本文标题:go 中的类与方法

          本文链接:https://www.haomeiwen.com/subject/ilqlghtx.html