结构体方法和接收者
# 3. 结构体方法和接收者
# 3.1 结构体说明
在 go 语言中,没有类的概念但是可以给类型(结构体,自定义类型)定义方法(Method)。所谓方法就是定义了接收者的函数。
Go语言中的==方法(Method)是一种作用于特定类型变量的函数==。这种特定类型变量叫做接收者(Receiver)。接收者的概念就类似于其他语言中的this或者 self。
方法的定义格式如下:
func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) {
函数体
}
1
2
3
2
3
# 3.2 结构体方法和接收者
给结构体 Person 定义一个方法打印 Person 的信息
package main
import "fmt"
type Person struct {
name string
age int
}
func (p Person) printInfo() {
fmt.Printf("姓名:%v 年龄:%v", p.name, p.age) // 姓名:小王子 年龄:25
}
func main() {
p1 := Person{
name: "小王子",
age: 25,
}
p1.printInfo()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 3.3 值类型和指针类型接收者
# 3.3.1 值类型的接收者
当方法作用于值类型接收者时,Go 语言会在代码运行时将接收者的值复制一份 。
在值类型接收者的方法中可以获取接收者的成员值,但修改操作只是针对副本 ,无法修改接收者变量本身。
# 3.3.2 指针类型的接收者
指针类型的接收者由一个结构体的指针组成。
由于指针的特性,调用方法时修改接收者指针的任意成员变量,在方法结束后,修改都是有效的。这种方式就十分接近于其他语言中面向对象中的 this 或者 self。
给结构体 Person 定义一个方法打印 Person 的信息
package main
import "fmt"
type Person struct {
name string
age int
}
// 值类型接受者
func (p Person) printInfo() {
fmt.Printf("姓名:%v 年龄:%v", p.name, p.age) // 姓名:小王子 年龄:25
}
//指针类型接收者
func (p *Person) setInfo(name string, age int) {
p.name = name
p.age = age
}
func main() {
p1 := Person{
name: "小王子",
age: 25,
}
p1.printInfo() // 姓名:小王子 年龄:25
p1.setInfo("张三", 20)
p1.printInfo() // 姓名:张三 年龄:20
}
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
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
上次更新: 2022/06/12, 15:48:09