Structs That Do Things
Harakat qiladigan structlar
type BankAccount struct {
Owner string
Balance float64
}
func (a BankAccount) Summary() string {
return fmt.Sprintf("%s: $%.2f", a.Owner, a.Balance)
}
func (a *BankAccount) Deposit(amount float64) {
a.Balance += amount
}Metodlar — bu turga tegishli funksiyalar. Metod nomidan oldingi qo'shimcha qism, (a BankAccount), receiver deb ataladi. Go funksiyani structga aynan shu orqali bog'laydi.
Ikki turi bor:
- •Value receiver
(a BankAccount)nusxa oladi. Summary maydonlarni o'qiy oladi, lekin har qanday o'zgarish yo'qoladi. - •Pointer receiver
(a *BankAccount)aslini oladi. Deposita.Balance += amountdeb yozganda, o'sha o'zgarish saqlanib qoladi.
Oddiy qoida: agar metod structni o'zgartirsa, * dan foydalaning. Agar u faqat o'qisa, yulduzchani qo'ymang. Keyinroq pointerlar haqida butun kursimiz bor. Hozircha shuni eslab qoling: yulduzcha "nusxa emas, haqiqiy narsa" degani.
>_ Exercise
Sensor struct'i siz uchun allaqachon aniqlangan:
type Sensor struct { Name string; Reading float64 }Ikkita metod yozing:
- •1.
(s Sensor) Status() string—"Name: Reading°C"formatida, 1 kasr xona bilan qaytaradi, masalan"engine: 92.5°C" - •2.
(s *Sensor) Record(value float64)— Reading'ni yangi qiymatga yangilaydi
Farqiga e'tibor bering: Status value receiver ishlatadi (faqat ma'lumot o'qiydi), Record esa pointer receiver ishlatadi (structni o'zgartiradi).
Misollar:
- •
Sensor{"engine", 92.5}.Status()"engine: 92.5°C"qaytaradi - •Istalgan sensor uchun
s.Record(100.3)dan keyin,s.Reading—100.3
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Metodlar structlarga xatti-harakat qo'shadi. Metod structni o'zgartirishi kerak bo'lganda pointer receiver * dan, faqat o'qishi kerak bo'lganda value receiver'dan foydalaning.
NEXT UP
Snap Together
$ go run main.go
Kodingizni ishga tushiring