go 中的类与方法

2020-05-02  本文已影响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里面定义方法,必须传入类名。(结构体名称), 传入的是哪个结构体,此方法就属于哪个结构体。

上一篇下一篇

猜你喜欢

热点阅读