GoDasturchi
Pointer as Argument

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:

example.go
func recordHit(count int) {
	count = count + 1
}

var requests int
recordHit(requests)
fmt.Println(requests) // hali ham 0

recordHit 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:

example.go
func recordHit(count *int) {
	*count = *count + 1
}

var requests int
recordHit(&requests)
recordHit(&requests)
fmt.Println(requests) // 2

Uni 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.

UZATISHNIMA NUSXALANADICHAQIRUVCHIGA KO'RINADIMI
Tqiymatyo'q
*Tmanzilha

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

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

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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:

example.go
func recordHit(count int) {
	count = count + 1
}

var requests int
recordHit(requests)
fmt.Println(requests) // hali ham 0

recordHit 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:

example.go
func recordHit(count *int) {
	*count = *count + 1
}

var requests int
recordHit(&requests)
recordHit(&requests)
fmt.Println(requests) // 2

Uni 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.

UZATISHNIMA NUSXALANADICHAQIRUVCHIGA KO'RINADIMI
Tqiymatyo'q
*Tmanzilha

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

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

Hints (0/3)

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