GO语言方法

来源:互联网 发布:传智播客7月-8月大数据 编辑:程序博客网 时间:2024/06/14 08:25

方法

Go 没有类。然而,仍然可以在结构体类型上定义方法。

方法接收者 出现在 func 关键字和方法名之间的参数中。

案例一----对象

package mainimport ("fmt""math")type Vertex struct {X, Y float64}func (v *Vertex) Abs() float64 { //指针类型return math.Sqrt(v.X*v.X + v.Y*v.Y)}func main() {v := &Vertex{3, 4}fmt.Println(v.Abs())}
案例二----普通类型

package mainimport ("fmt""math")type MyFloat float64func (f MyFloat) Abs() float64 { //值类型if f < 0 {return float64(-f)}return float64(f)}func main() {f := MyFloat(-math.Sqrt2)fmt.Println(f.Abs())}
上述定义了2种传递类型参数的方法,一个是在 *Vertex 指针类型上,而另一个在 MyFloat 值类型上。区别如下

1.值类型传递的值只在当前方法上有用

2.指针类型因其传递的是内存地址,所以当在方法中修改结构体中的任意参数值时,会直接作用保存在结构体中。

案例:

package mainimport ("fmt""math")type Vertex struct {X, Y float64}func (v *Vertex) Scale(f float64) {v.X = v.X * fv.Y = v.Y * f}func (v *Vertex) Abs() float64 {return math.Sqrt(v.X*v.X + v.Y*v.Y)}func main() {v := &Vertex{3, 4}fmt.Printf("Before scaling: %+v, Abs: %v\n", v, v.Abs())
v.Scale(5)   
//此处调用了修改结构体参数值的方法,当方法关联的v *Vertex为这个指针类型时,v这个对象的值将会被改变,并导致后边的Abs方法输出结果为25。//如果当我们去掉指针*号,那么这个方法所关联的Vertex实际是一个&Vertex{3, 4}的副本
//此时在Scale方法中修改对象的值是无效果的,它不能传递到后边的Abs方法,此时Abs返回的结果还是5fmt.Printf("After scaling: %+v, Abs: %v\n", v, v.Abs())}




原创粉丝点击