Pointer as Argument
Argument sifatida pointer
Go — qiymat orqali uzatish (pass-by-value): har bir argument funksiyaga nusxalanadi, va funksiya faqat o'z nusxasini ko'radi. Shuning uchun bu so'rov hisoblagichi hech qachon haqiqatan sanamaydi:
func recordHit(count int) {
count = count + 1
}
var requests int
recordHit(requests)
fmt.Println(requests) // hali ham 0recordHit o'zining lokal countini oshirdi va chiqishda uni tashlab yubordi. Chaqiruvchining requestsi hech qachon o'zgarmadi.
Buning o'rniga manzilni uzating
Funksiyaga qaytadan yozish imkonini berish uchun, unga pointer bering. Funksiya *int qabul qiladi, va yozuv chaqiruvchining xotirasiga tushadi:
func recordHit(count *int) {
*count = *count + 1
}
var requests int
recordHit(&requests)
recordHit(&requests)
fmt.Println(requests) // 2Uni ikki marta chaqiring va hisoblagich haqiqatan sanaydi. Go hali ham argumentni nusxalaydi, lekin endi nusxa — int emas, manzil. Chaqiruvchi va funksiya bir xil manzil qog'ozining fotonusxalarini ushlab turadi, va ikkala qog'oz ham bir xil requestsga olib boradi.
| UZATISH | NIMA NUSXALANADI | CHAQIRUVCHIGA KO'RINADIMI |
|---|---|---|
T | qiymat | yo'q |
*T | manzil | ha |
Funksiya qaytadan yozishi kerak bo'lganda *Tga murojaat qiling. Agar u faqat o'qisa, Tni uzating va signaturani halol saqlang.
>_ Exercise
Sizning xizmatingiz so'rovlarga xizmat ko'rsatish uchun sarflagan umumiy vaqtni kuzatadi. Har bir so'rov tugagandan keyin, ishlovchi addLatency(&totalMillis, elapsed) ni chaqiradi. addLatencyni yozing, u pointer ishora qilayotgan qiymatga msni qo'shsin.
Signatura
func addLatency(total *int, ms int)Talablar
- •Joriy jamini pointer orqali o'qing
- •Unga
msni qo'shing - •Yangi jamini xuddi shu pointer orqali qaytadan yozing
- •Chaqiruv qaytgandan keyin, chaqiruvchining
totalMillisi yangi jamini ushlab turishi kerak
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Funksiya chaqiruvchining o'zgaruvchisini o'zgartirishi kerak bo'lganda *T uzating, chunki manzilni nusxalash baribir ikkala tomonga bir xil xotiraga yetib borish imkonini beradi.
NEXT UP
Pointers Into Slices
$ go run main.go
Kodingizni ishga tushiring