熟悉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的值被改变了。
有疑问加站长微信联系(非本文作者)