GoDasturchi
When to Use a Pointer

When to Use a Pointer

Pointerni qachon ishlatish kerak

Pointer qiymat borishi mumkin bo'lgan istalgan joyga borishi mumkin: parametr, metod receiveri, struct maydoni, qaytish turi. func (s *Service) yoki func (s Service)? MaxAttempts int yoki MaxAttempts *int? Pozitsiya o'zgaradi, lekin har safar bir xil uchta savol buni hal qiladi.

1. Aslni o'zgartirish kerakmi?

Agar kod chaqiruvchi ushlab turgan narsani o'zgartirishi kerak bo'lsa, unga pointer kerak. Value receiver yoki value parametr chaqiruv qaytganda yo'qoladigan nusxani o'zgartiradi.

example.go
func (p *Pool) Acquire() { p.inUse++ } // chaqiruvchining pool'i sonning oshganini ko'radi

2. Qiymatni nusxalash qimmatga tushadimi?

Ko'p maydonli struct har bir value chaqiruvida maydon-baмaydon nusxalanadi. Pointer esa o'lchamidan qat'i nazar bitta manzilni nusxalaydi.

example.go
func render(r *Report) // Report'da 30 ta maydon bor: 30 ta maydon emas, bitta pointerni nusxalang

3. "O'rnatilmagan"ni noldan ajratish kerakmi?

Faqat pointer nil bo'lishi mumkin, shuning uchun "bu yerda umuman qiymat yo'q" deya oladigan yagona tur — pointer. Struct maydoni yoki qaytish qiymati "nolga o'rnatilgan"ni "hech qachon o'rnatilmagan"dan ajratishi kerak bo'lganda unga murojaat qiling:

example.go
type RetryOptions struct {
	MaxAttempts *int // nil: chaqiruvchi hech narsa demagan. 0: chaqiruvchi qayta urinishni xohlamaydi.
}

Oddiy int bu ikkala holatni 0ga jamlaydi. Pointer ularni ajratib turadi, bu esa options struct'iga aynan kerak bo'lgan narsa.

Standart holat

Structda shubhangiz bo'lsa, pointerga murojaat qiling va uni turning har bir metodida ishlating: value va pointer receiverlarni aralashtirish tushunarsiz interface-qanoatlantirish xatolariga olib keladi. Nusxalash arzon va hech qachon o'zgartirilmaydigan kichik turlar uchun oddiy qiymatlarni saqlang: ID, koordinata, time.Duration.

QACHON POINTERGA MUROJAAT QILISHQACHON QIYMAT YETARLI
Aslini o'zgartirasizTur kichik va nusxalash arzon
Struct kattaUni hech qachon o'zgartirmaysiz
"O'rnatilmagan"ni bildirish uchun nil kerakNusxa aynan xohlagan narsangiz

>_ Exercise

UserStore foydalanuvchilarni mapda saqlaydi. *UserStore ustida Find metodini yozing, u mos foydalanuvchiga pointer, yoki shu id'ga ega foydalanuvchi bo'lmasa nil qaytarsin. O'sha nil — pointer qaytarishning butun maqsadi: u "mana bu" yoki "bu yerda hech narsa yo'q" deya oladi, oddiy User esa bunday qila olmaydi.

Talablar

  • Findni *UserStore ustida id string qabul qilib *User qaytaradigan metod sifatida e'lon qiling
  • Id mavjud bo'lganda mos foydalanuvchiga ishora qiluvchi *User qaytaring
  • Hech qanday foydalanuvchi bu id'ga ega bo'lmasa nil qaytaring
  • Chaqiruvchi natijani if u == nil bilan tekshiradi, shuning uchun moslik topilmasa nil, nol qiymatli User emas, qaytishi kerak

Stuck? Reveal a hint to help you.

Hints (0/5)

Key Takeaway

Key Takeaway:

Aslni o'zgartirish kerak bo'lganda, qiymat nusxalash qimmat bo'lganda, yoki nil "o'rnatilmagan"ni bildirishi kerak bo'lganda pointerdan foydalaning. Aks holda, qiymat uzating.

NEXT UP

Nil Pointer Safety

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

When to Use a Pointer

Pointerni qachon ishlatish kerak

Pointer qiymat borishi mumkin bo'lgan istalgan joyga borishi mumkin: parametr, metod receiveri, struct maydoni, qaytish turi. func (s *Service) yoki func (s Service)? MaxAttempts int yoki MaxAttempts *int? Pozitsiya o'zgaradi, lekin har safar bir xil uchta savol buni hal qiladi.

1. Aslni o'zgartirish kerakmi?

Agar kod chaqiruvchi ushlab turgan narsani o'zgartirishi kerak bo'lsa, unga pointer kerak. Value receiver yoki value parametr chaqiruv qaytganda yo'qoladigan nusxani o'zgartiradi.

example.go
func (p *Pool) Acquire() { p.inUse++ } // chaqiruvchining pool'i sonning oshganini ko'radi

2. Qiymatni nusxalash qimmatga tushadimi?

Ko'p maydonli struct har bir value chaqiruvida maydon-baмaydon nusxalanadi. Pointer esa o'lchamidan qat'i nazar bitta manzilni nusxalaydi.

example.go
func render(r *Report) // Report'da 30 ta maydon bor: 30 ta maydon emas, bitta pointerni nusxalang

3. "O'rnatilmagan"ni noldan ajratish kerakmi?

Faqat pointer nil bo'lishi mumkin, shuning uchun "bu yerda umuman qiymat yo'q" deya oladigan yagona tur — pointer. Struct maydoni yoki qaytish qiymati "nolga o'rnatilgan"ni "hech qachon o'rnatilmagan"dan ajratishi kerak bo'lganda unga murojaat qiling:

example.go
type RetryOptions struct {
	MaxAttempts *int // nil: chaqiruvchi hech narsa demagan. 0: chaqiruvchi qayta urinishni xohlamaydi.
}

Oddiy int bu ikkala holatni 0ga jamlaydi. Pointer ularni ajratib turadi, bu esa options struct'iga aynan kerak bo'lgan narsa.

Standart holat

Structda shubhangiz bo'lsa, pointerga murojaat qiling va uni turning har bir metodida ishlating: value va pointer receiverlarni aralashtirish tushunarsiz interface-qanoatlantirish xatolariga olib keladi. Nusxalash arzon va hech qachon o'zgartirilmaydigan kichik turlar uchun oddiy qiymatlarni saqlang: ID, koordinata, time.Duration.

QACHON POINTERGA MUROJAAT QILISHQACHON QIYMAT YETARLI
Aslini o'zgartirasizTur kichik va nusxalash arzon
Struct kattaUni hech qachon o'zgartirmaysiz
"O'rnatilmagan"ni bildirish uchun nil kerakNusxa aynan xohlagan narsangiz

>_ Exercise

UserStore foydalanuvchilarni mapda saqlaydi. *UserStore ustida Find metodini yozing, u mos foydalanuvchiga pointer, yoki shu id'ga ega foydalanuvchi bo'lmasa nil qaytarsin. O'sha nil — pointer qaytarishning butun maqsadi: u "mana bu" yoki "bu yerda hech narsa yo'q" deya oladi, oddiy User esa bunday qila olmaydi.

Talablar

  • Findni *UserStore ustida id string qabul qilib *User qaytaradigan metod sifatida e'lon qiling
  • Id mavjud bo'lganda mos foydalanuvchiga ishora qiluvchi *User qaytaring
  • Hech qanday foydalanuvchi bu id'ga ega bo'lmasa nil qaytaring
  • Chaqiruvchi natijani if u == nil bilan tekshiradi, shuning uchun moslik topilmasa nil, nol qiymatli User emas, qaytishi kerak

Stuck? Reveal a hint to help you.

Hints (0/5)

Key Takeaway

Key Takeaway:

Aslni o'zgartirish kerak bo'lganda, qiymat nusxalash qimmat bo'lganda, yoki nil "o'rnatilmagan"ni bildirishi kerak bo'lganda pointerdan foydalaning. Aks holda, qiymat uzating.

NEXT UP

Nil Pointer Safety