Menu
CoddyTech

指针接收者与值接收者

本课属于 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 会自动处理引用。两者的调用方式相同。

challenge icon

挑战

中等

使用正确的接收者类型,为 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())
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Go 在线编译器