熟悉Go函数的语法结构
因为GO没有类的概念,所以使用结构体来模拟。代码中的函数分别计算两个整数的平方根和取数值的绝对值。
package main
import (
"fmt"
"math"
)
type MyFloat float64
type Vertex struct {
X, Y float64
}
//Vertex指针对应的Abs方法
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
//MyFloat结构体对应的Abs方法
func (f MyFloat) Abs() float64 {
if f < 0 {
return float64(-f)
}
return float64(f)
}
func main() {
v := &Vertex{6, 4} //获取Vertex结构体的指针
fmt.Println(v.Abs())
f := MyFloat(-math.Sqrt2) //取2的平方根
fmt.Println("float Abs=", f.Abs())
}
此处定义对应的方法的意义在于操作的是原始对象。如果定义为结构体类型对应的方法,则表示传递的参数为结构体的一个副本,而不是原始对象。我们可以添加Add方法,如下所示:
package main
import (
"fmt"
"math"
)
type MyFloat float64
type Vertex struct {
X, Y float64
}
//Vertex指针对应的Abs方法
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
//Vertex指针对应的Add方法
func (v *Vertex) Add(f float64) {
v.X += f
v.Y += f
}
//MyFloat结构体对应的Abs方法
func (f MyFloat) Abs() float64 {
if f < 0 {
return float64(-f)
}
return float64(f)
}
func main() {
v := &Vertex{6, 4} //获取Vertex结构体的指针
fmt.Println(v.Abs())
v.Add(3.14)
fmt.Println(v)
f := MyFloat(-math.Sqrt2) //取2的平方根
fmt.Println("float Abs=", f.Abs())
}
运行之后,对象v内部的X和Y的值被改变了。