有点摆烂了,今天没学多少。。。
package main
//在函数声明时,在其名字之前放上一个变量,即是一个方法
import "math"
type Point struct {
x, y int
}
// 方法的接收器
// 向一个对象发送消息
// 在Go语言中,我们并不会像其它语言那样用this或者self作为接收器;我们可以任意的选择接收器的名字。
func (p Point) Distance(q Point) float64 {
return math.Hypot(float64(q.x-p.x), float64(q.y-p.y))
}
//由于方法和字段都是在同一命名空间,所以如果我们在这里声明一个X方法的话,编译器会报错,因为在调用p.X时会有歧义
//Point类下声明的Point.Distance方法
//因为每种类型都有其方法的命名空间,我们在用Distance这个名字的时候,不同的Distance调用指向了不同类型里的Distance方法。
// 可以为slice定义方法
// Path是一个命名的slice类型,而不是Point那样的struct类型,然而我们依然可以为它定义方法。在能够给任意类型定义方法这一点上,Go和很多其它的面向对象的语言不太一样。因此在Go语言里,我们为一些简单的数值、字符串、slice、map来定义一些附加行为很方便。
type path []Point
func (path path) Distance() (sum float64) {
sum = 0.0
for i := range path {
if i > 0 {
sum += path[i-1].Distance(path[i])
}
}
return
}
//编译器会根据方法的名字以及接收器来决定具体调用的是哪一个函数
//对于一个给定的类型,其内部的方法都必须有唯一的方法名,但是不同的类型却可以有同样的方法名,
//没有必要非在方法名之前加类型名来消除歧义
//方法比之函数的一些好处:方法名可以简短。当我们在包外调用的时候这种好处就会被放大,因为我们可以使用这个短名字,而可以省略掉包的名字,