golang中func的receiver

golang中如果你定了一个struct T,有个可以定义一个接收者为T的函数来使T更强大

但是T作为receiver有两种形式:

一种是T本身,另一种是*T,即T的指针形式

但作为T本身是 方法里的操作 相当于把 T 复制了一份出来

如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main
import (
"fmt"
)
func main() {
var persion=Persion{Name:"Tom",Age:10}
fmt.Println(persion)
persion.Say("hello yahui")
fmt.Println(persion)
}
type Persion struct
{
Name string
Age int
}
func (p Persion) Say(word string) {
p.Name="Jack"
fmt.Println(p.Name,"Say",word)
}

输出:

1
2
3
4
{Tom 10}
Jack Say hello yahui
{Tom 10}

但作为*T是方法里的操作是真正的正在引用T

如以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main
import (
"fmt"
)
func main() {
var persion=Persion{Name:"Tom",Age:10}
fmt.Println(persion)
persion.Say("hello yahui")
fmt.Println(persion)
}
type Persion struct
{
Name string
Age int
}
func (p *Persion) Say(word string) {
p.Name="Jack"
fmt.Println(p.Name,"Say",word)
}

输出:

1
2
3
{Tom 10}
Jack Say hello yahui
{Jack 10}