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.
func (p *Pool) Acquire() { p.inUse++ } // chaqiruvchining pool'i sonning oshganini ko'radi2. 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.
func render(r *Report) // Report'da 30 ta maydon bor: 30 ta maydon emas, bitta pointerni nusxalang3. "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:
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 QILISH | QACHON QIYMAT YETARLI |
|---|---|
| Aslini o'zgartirasiz | Tur kichik va nusxalash arzon |
| Struct katta | Uni hech qachon o'zgartirmaysiz |
"O'rnatilmagan"ni bildirish uchun nil kerak | Nusxa 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*UserStoreustidaid stringqabul qilib*Userqaytaradigan metod sifatida e'lon qiling - •Id mavjud bo'lganda mos foydalanuvchiga ishora qiluvchi
*Userqaytaring - •Hech qanday foydalanuvchi bu id'ga ega bo'lmasa
nilqaytaring - •Chaqiruvchi natijani
if u == nilbilan tekshiradi, shuning uchun moslik topilmasanil, nol qiymatliUseremas, qaytishi kerak
Stuck? Reveal a hint to help you.
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
$ go run main.go
Kodingizni ishga tushiring