Bài tập Go
Bank Account in Go with Errors
A struct, pointer methods and your own error types: deposits and withdrawals that can fail safely.
Bạn sẽ học được gì
- Methods that return error
- A custom error type
- Unexported fields
Operation → result
Deposit(50)<nil>Withdraw(500)insufficient fundsWithdraw(120)<nil>, balance 30Every operation can succeed or fail
This exercise combines a struct, pointer methods and error handling. Each operation returns an error, and the error says exactly what went wrong.
Deposit rejects amounts that are not positive and Withdraw rejects an amount larger than the balance, so the balance can never become invalid. balance starts with a lower-case letter, so code outside the package cannot change it directly. A nil error prints as <nil>.
Những điểm quan trọng
- Deposit rejects amounts that are not positive.
- Withdraw rejects more than the balance.
- balance is unexported, so only the methods change it.
Ví dụ Go chạy được
main.go
package main
import (
"errors"
"fmt"
)
var ErrInvalidAmount = errors.New("amount must be positive")
type InsufficientFundsError struct {
Needed, Available int
}
func (e InsufficientFundsError) Error() string {
return fmt.Sprintf("insufficient funds: need %d, have %d", e.Needed, e.Available)
}
type Account struct {
Owner string
balance int
}
func (a *Account) Deposit(amount int) error {
if amount <= 0 {
return ErrInvalidAmount
}
a.balance += amount
return nil
}
func (a *Account) Withdraw(amount int) error {
if amount > a.balance {
return InsufficientFundsError{Needed: amount, Available: a.balance}
}
a.balance -= amount
return nil
}
func main() {
account := &Account{Owner: "Ada", balance: 100}
fmt.Println(account.Deposit(50))
fmt.Println(account.Withdraw(500))
fmt.Println(account.Deposit(0))
fmt.Println(account.Withdraw(120))
fmt.Println(account.Owner, "has", account.balance)
}
<nil>
insufficient funds: need 500, have 150
amount must be positive
<nil>
Ada has 30Luyện tập
Mở ví dụ trong trình biên dịch online, đổi một giá trị hoặc thêm một dòng, rồi đoán kết quả trước khi chạy. Sau đó cố ý làm code bị lỗi và đọc thông báo của trình biên dịch.
Bạn học xong bài này chưa?
Đánh dấu đã học để theo dõi tiến độ của bạn.
Tiến độ của bạn đang được lưu trong trình duyệt này Đăng nhập để giữ tiến độ trên mọi thiết bị.
Luyện tập với thử thách
Áp dụng kiến thức của bài học này để giải một bài toán thực tế. Mỗi thử thách chạy ngay trên trình duyệt, có kiểm thử tức thì và AI nhận xét.
Tất cả thử thách