go-接收者

定义一个计算长方形面积的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main

import (
"fmt"
)

type Rectangle struct {
width, height float64
}

func area(r Rectangle) float64 {
return r.width * r.height
}

func main() {
r1 := Rectangle{12, 2}
r2 := Rectangle{9, 4}
fmt.Println("Area of r1 is: ", area(r1))
fmt.Println("Area of r2 is: ", area(r2))
}

上面这种方式定义是一个可以求长方形面积的函数area。这个方法并不是属于Rectangle这个对象。如果要把area当作Rectanglemethod,也就是把area当作Rectangle的一个 属性,可以使用接收者。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 虽然method名称一样,但是如果接收者不一样,那么method就不一样
// method里面可以访问接收者的字段
package main

import (
"fmt"
"math"
)

type Rectangle struct {
width, height float64
}

type Circle struct {
radius float64
}

func (r Rectangle) area() float64 {
return r.width*r.height
}

func (c Circle) area() float64 {
return c.radius *c.radius *math.Pi
}

func main() {
r1 := Rectangle{12, 2}
r2 := Rectangle{9, 4}
c1 :=Circle{10}
c2 :=Circle{25}
fmt.Println("Area of r1 is: ", r1.area())
fmt.Println("Area of r2 is: ", r2.area())
fmt.Println("Area of c1 is: ", c1.area())
fmt.Println("Area of c2 is: ", c2.area())
}

接收者的值传递OR引用传递

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import (
"fmt"
)

type Rectangle struct {
width, height float64
}

func (r Rectangle) area() float64 {
r.width = 10
return r.width*r.height
}



func main() {
r1 := Rectangle{12, 2}
fmt.Println("r1.width is: ",r1.width )
r1.area()
fmt.Println("r1.width is: ",r1.width )
}

image

areamethod改为如下:

1
2
3
4
func (r *Rectangle) area() float64  {
r.width = 10
return r.width*r.height
}

结果如下:
image

如果接收者前面没有加*号则表示方法使用的是引用传递,指针作为Receiver会对实例对象的内容发生操作,如果没加星号则是以值传递,只是对实例的副本进行操作。


Ref:
1.go web编程