指针接收者与值接收者
本课属于 Coddy GO 学习旅程的“面向对象编程”单元。第 8 课,共 107 课。
方法可以使用值接收者或指针接收者。值接收者作用于结构体的副本。指针接收者作用于原始结构体,并且可以修改它的字段。
值接收者:作用于副本
type Counter struct {
Count int
}
func (c Counter) GetCount() int {
return c.Count
}
// 这不会修改原始值
func (c Counter) IncrementWrong() {
c.Count++ // 只会修改副本!
}指针接收者:会修改原对象
// 这确实会修改原始对象
func (c *Counter) Increment() {
c.Count++
}
func (c *Counter) Reset() {
c.Count = 0
}同时使用两者
func main() {
counter := Counter{Count: 0}
counter.Increment()
counter.Increment()
fmt.Println(counter.GetCount()) // 输出:2
counter.Reset()
fmt.Println(counter.GetCount()) // 输出:0
}当方法只读取数据时,使用值接收者。当方法需要修改结构体的字段时,使用指针接收者(*StructName)。Go 会自动处理引用。两者的调用方式相同。
挑战
中等使用正确的接收者类型,为 Wallet 结构体添加方法:
GetBalance:值接收者,返回当前余额Deposit:指针接收者,将金额加到余额中Withdraw:指针接收者,仅在余额充足时扣除金额
亲手试试
package main
import "fmt"
func main() {
var balance, deposit, withdraw float64
fmt.Scan(&balance, &deposit, &withdraw)
w := Wallet{Balance: balance}
fmt.Printf("Balance: %.2f\n", w.GetBalance())
w.Deposit(deposit)
fmt.Printf("After deposit: %.2f\n", w.GetBalance())
w.Withdraw(withdraw)
fmt.Printf("After withdrawal: %.2f\n", w.GetBalance())
fmt.Printf("Final balance: %.2f\n", w.GetBalance())
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Go 在线编译器