记住一句话:go语言中任何内置类型都不能直接绑定方法。绑定方法需要自定义类型
先来看一下go总的函数式编程
例子中做了求两个点之间的距离,用到了math方法
package main
import (
"fmt"
"math"
)
type Point struct {
X, Y float64
}
func Distance (p, q Point) float64 {
return math.Hypot(q.X-p.X, q.Y-p.Y)
}
func main() {
p := Point{1,2}
q := Point{4,6}
s := Distance(p, q)
fmt.Println(s)
}
再来看一下go中对象的声明写法
package main
import (
"math"
"fmt"
)
type Point struct {
X,Y float64
}
func (q Point) Distance(p Point) float64 {
return math.Hypot(q.X-p.X, q.Y-p.Y)
}
func main() {
p := Point{1,2}
q := Point{4,6}
fmt.Println(q.Distance(p ))
}
再来深入一下,求所有点的距离之和
package main
import (
"math"
"fmt"
)
type Point struct {
X,Y float64
}
func (p Point) Distance(q Point) float64 {
return math.Hypot(p.X-q.X, p.Y-q.Y)
}
func ALlDistance(path []Point) float64 {
var s float64
for i:=1; i<len(path)-1; i++{
s += path[i].Distance(path[i-1])
}
return s
}
func main() {
path := []Point{{1,2}, {3,4}, {5,6}}
fmt.Println(ALlDistance(path))
}
再来继续优化一下,对象与type的结合
在go中 type是用来定义类型的。
首先定义一个自定义的类型,这类型不能是go内置的类型。
然后将类型与函数绑定
go中的对象就是你要处理的数据,与处理这个数据所需要的函数封装在一起
package main
import (
"math"
"fmt"
)
type Point struct {
X,Y float64
}
type Path []Point
func (p Point) Distance(q Point) float64 {
return math.Hypot(p.X-q.X, p.Y-q.Y)
}
func (path Path) ALlDistance() float64 {
var s float64
for i:=1; i<len(path)-1; i++{
s += path[i].Distance(path[i-1])
}
return s
}
func main() {
path := Path{{1,2}, {3,4}, {5,6}}
fmt.Println(path.ALlDistance())
}