Go 指南学习笔记八

1.结构体方法

Go语言不像JAVA,没有类的定义,但是依然可以为结构体定义方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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()) // 5
}

2.还可以对包内任意类型定义任意方法,但是不能对包外的类型或者基础类型定义方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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()) // 1.4142135623730951
}

3.方法可以与类型和类型的指针相关联

如1中的Abs方法是作用的*Vertex指针类型上

1
2
3
4
func (v *Vertex) Scale(f float64){
v.X = v.X * f
v.Y = v.Y * f
}

1
2
3
4
func (v Vertex) Scale(f float64){
v.X = v.X * f
v.Y = v.Y * f
}

的区别

v := *Vertex(3,5)
v.Scale(5)

前边的是用*Vertex指针类型接受,是引用传递,所以会改变接受者v的原始值,而后边的是用变量(后者说是对象)接受,是值传递,会对v进行一份copy,而不会对原始值做更改。

如果您觉得对您有帮助,谢谢您的赞赏!