GO语言方法

方法

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

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

案例一----对象

package main

import (
	"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 main

import (
	"fmt"
	"math"
)

type MyFloat float64

func (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 main

import (
	"fmt"
	"math"
)

type Vertex struct {
	X, Y float64
}

func (v *Vertex) Scale(f float64) {
	v.X = v.X * f
	v.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返回的结果还是5
	fmt.Printf("After scaling: %+v, Abs: %v\n", v, v.Abs())
}




你可能感兴趣的:(golang)