74 lines
1.3 KiB
Markdown
74 lines
1.3 KiB
Markdown
|
|
# 02-methods - 方法定义
|
||
|
|
|
||
|
|
## 知识点讲解
|
||
|
|
|
||
|
|
### 方法定义
|
||
|
|
|
||
|
|
```go
|
||
|
|
// 值接收者
|
||
|
|
func (p Person) GetName() string {
|
||
|
|
return p.Name
|
||
|
|
}
|
||
|
|
|
||
|
|
// 指针接收者
|
||
|
|
func (p *Person) SetName(name string) {
|
||
|
|
p.Name = name
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 值接收者 vs 指针接收者
|
||
|
|
|
||
|
|
```go
|
||
|
|
type Counter struct {
|
||
|
|
value int
|
||
|
|
}
|
||
|
|
|
||
|
|
func (c Counter) GetValue() int {
|
||
|
|
return c.value // 只读,不修改原值
|
||
|
|
}
|
||
|
|
|
||
|
|
func (c *Counter) Increment() {
|
||
|
|
c.value++ // 值读写,修改原值
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 方法选择
|
||
|
|
|
||
|
|
| 场景 | 接收者类型 |
|
||
|
|
|------|-----------|
|
||
|
|
| 方法不需要修改接收者 | 值接收者 |
|
||
|
|
| 方法需要修改接收者 | 指针接收者 |
|
||
|
|
| 接收者较大,避免拷贝 | 指针接收者 |
|
||
|
|
| 保持接口兼容性 | 值接收者 |
|
||
|
|
|
||
|
|
### 方法表达式与值
|
||
|
|
|
||
|
|
```go
|
||
|
|
c := Counter{value: 10}
|
||
|
|
|
||
|
|
// 方法调用
|
||
|
|
c.Increment()
|
||
|
|
|
||
|
|
// 方法表达式
|
||
|
|
f := (*Counter).Increment
|
||
|
|
f(&c)
|
||
|
|
```
|
||
|
|
|
||
|
|
### 重要提示
|
||
|
|
|
||
|
|
- 值接收者可以用于指针类型,反之则需要Go自动转换
|
||
|
|
- 方法集规则影响接口实现
|
||
|
|
- 选择接收者类型要考虑一致性
|
||
|
|
|
||
|
|
## 学习目标
|
||
|
|
|
||
|
|
完成本练习后,你将:
|
||
|
|
- ✅ 掌握方法的定义方式
|
||
|
|
- ✅ 理解值接收者和指针接收者的区别
|
||
|
|
- ✅ 学会为结构体定义方法
|
||
|
|
- ✅ 掌握方法的选择原则
|
||
|
|
|
||
|
|
## 练习说明
|
||
|
|
|
||
|
|
打开 `main.go`,根据注释提示填充代码,完成后运行 `go test -v` 验证答案。
|