Menu
CoddyTech

Receiver kiểu con trỏ và kiểu giá trị

Thuộc phần Lập trình hướng đối tượng trong hành trình GO của Coddy. Bài học 8 trên 107.

Phương thức có thể dùng receiver giá trị hoặc receiver con trỏ. Receiver giá trị hoạt động trên một bản sao của struct. Receiver con trỏ hoạt động trên struct gốc và có thể thay đổi các trường của nó.

Receiver giá trị: hoạt động trên một bản sao

type Counter struct {
    Count int
}

func (c Counter) GetCount() int {
    return c.Count
}

// Thao tác này KHÔNG thay đổi bản gốc
func (c Counter) IncrementWrong() {
    c.Count++ // Chỉ thay đổi bản sao!
}

Receiver con trỏ: thay đổi đối tượng gốc

// Đoạn này thực sự làm thay đổi bản gốc
func (c *Counter) Increment() {
    c.Count++
}

func (c *Counter) Reset() {
    c.Count = 0
}

Dùng cả hai cùng nhau

func main() {
    counter := Counter{Count: 0}

    counter.Increment()
    counter.Increment()
    fmt.Println(counter.GetCount()) // Đầu ra: 2

    counter.Reset()
    fmt.Println(counter.GetCount()) // Đầu ra: 0
}

Dùng receiver giá trị khi phương thức chỉ đọc dữ liệu. Dùng receiver con trỏ (*StructName) khi phương thức cần sửa đổi các trường của struct. Go tự động xử lý việc tham chiếu. Bạn gọi cả hai theo cùng một cách.

challenge icon

Thử thách

Trung bình

Thêm các phương thức vào struct Wallet bằng kiểu receiver phù hợp:

  • GetBalance: receiver giá trị, trả về số dư hiện tại
  • Deposit: receiver con trỏ, cộng số tiền vào số dư
  • Withdraw: receiver con trỏ, trừ số tiền chỉ khi số dư đủ

Tự làm thử

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 iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Go online