看下面代码
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里面定义方法,必须传入类名。(结构体名称), 传入的是哪个结构体,此方法就属于哪个结构体。
网友评论