GoDasturchi
Structs That Do Things

Structs That Do Things

Harakat qiladigan structlar

example.go
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. Deposit a.Balance += amount deb 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:

example.go
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.Reading100.3

Stuck? Reveal a hint to help you.

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Structs That Do Things

Harakat qiladigan structlar

example.go
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. Deposit a.Balance += amount deb 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:

example.go
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.Reading100.3

Stuck? Reveal a hint to help you.

Hints (0/3)

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