GoDasturchi
Pointer to Struct

Pointer to Struct

Structga pointer

Hozirgacha ushlab turgan har bir pointeringiz intga ishora qilgan, lekin & va * istalgan turda bir xil ishlaydi: satrlar, slicelar, maplar, structlar. Structlar ham bundan mustasno emas: & bilan manzil oling, * orqali o'qing yoki yozing.

JSON payload'ni dekodlang yoki ma'lumotlar bazasi qatorini yuklang — deyarli har doim User emas, *User olasiz. Mana bu pointer qanday yaratiladi va o'qiladi:

example.go
type User struct {
	Name string
	Age  int
}

u := &User{Name: "Patrik", Age: 99}
fmt.Println(u.Name) // Patrik

&User{...} bitta qadamda structni yaratadi va sizga uning manzilini beradi, alohida e'lon-qilib-keyin-manzil-olish qatorisiz.

Maydonga murojaatda avtomatik dereferentsiya

Oldingi darslardagi qoidalarga ko'ra, Nameni pointer orqali o'qish shunday ko'rinishi kerak edi:

example.go
fmt.Println((*u).Name) // buni qilmang

Dereferentsiya qiling, keyin maydonni oling. Go bu qadamni siz uchun bajaradi:

example.go
fmt.Println(u.Name) // buni qiling

. ning chap tomoni structga pointer bo'lganda, kompilyator u.Nameni (*u).Name deb o'qiydi. Yozishda ham xuddi shu qisqartma bor: u.Name = "Patrik" (*u).Name = "Patrik" ga aylanadi.

*Struct ustidagi p.Field siz uchun pointer orqali yetib boradi. (*p).Field ham to'g'ri, lekin hech kim uni yozmaydi.

Nega Go kodining aksariyati *User uzatadi

Katta structni har bir chaqiruvda nusxalash uning manzilini nusxalashdan qimmatroqqa tushadi, va o'zgartiradigan metodlarga baribir pointer kerak. Shuning uchun aksariyat kod *User, *Order, *Request uzatadi. Oddiy User esa nusxalashi arzon va hech qachon o'zgartirilmaydigan kichik shakllar uchun.

>_ Exercise

Sizning transkodlash quvuringiz navbatga qo'yib, atrofga uzatishi mumkin bo'lgan ishni yaratish uchun NewVideoJobni chaqiradi. Berilgan fayl nomi va maqsadli o'lchamni olib yuradigan *VideoJob qaytaradigan butun NewVideoJob funksiyasini yozing.

Talablar

  • Funksiyani func NewVideoJob(filename string, resolution int) *VideoJob signaturasi bilan yozing
  • Structni &VideoJob{...} bilan yarating, shunda pointer qaytarasiz
  • Filename va Resolutionni argumentlardan o'rnating
  • Pointerni qaytaring

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Pointerlar structlarda ham xuddi boshqa turdagidek ishlaydi, lekin Go sizga structni yaratayotganda uning manzilini olish va maydonlarga qo'lda dereferentsiya qilmasdan pointer orqali murojaat qilish imkonini beradi. Pointer structdan arzonroq nusxalanadigani uchun, aksariyat Go kodi structlarni pointer orqali uzatadi.

NEXT UP

The new Builtin

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Pointer to Struct

Structga pointer

Hozirgacha ushlab turgan har bir pointeringiz intga ishora qilgan, lekin & va * istalgan turda bir xil ishlaydi: satrlar, slicelar, maplar, structlar. Structlar ham bundan mustasno emas: & bilan manzil oling, * orqali o'qing yoki yozing.

JSON payload'ni dekodlang yoki ma'lumotlar bazasi qatorini yuklang — deyarli har doim User emas, *User olasiz. Mana bu pointer qanday yaratiladi va o'qiladi:

example.go
type User struct {
	Name string
	Age  int
}

u := &User{Name: "Patrik", Age: 99}
fmt.Println(u.Name) // Patrik

&User{...} bitta qadamda structni yaratadi va sizga uning manzilini beradi, alohida e'lon-qilib-keyin-manzil-olish qatorisiz.

Maydonga murojaatda avtomatik dereferentsiya

Oldingi darslardagi qoidalarga ko'ra, Nameni pointer orqali o'qish shunday ko'rinishi kerak edi:

example.go
fmt.Println((*u).Name) // buni qilmang

Dereferentsiya qiling, keyin maydonni oling. Go bu qadamni siz uchun bajaradi:

example.go
fmt.Println(u.Name) // buni qiling

. ning chap tomoni structga pointer bo'lganda, kompilyator u.Nameni (*u).Name deb o'qiydi. Yozishda ham xuddi shu qisqartma bor: u.Name = "Patrik" (*u).Name = "Patrik" ga aylanadi.

*Struct ustidagi p.Field siz uchun pointer orqali yetib boradi. (*p).Field ham to'g'ri, lekin hech kim uni yozmaydi.

Nega Go kodining aksariyati *User uzatadi

Katta structni har bir chaqiruvda nusxalash uning manzilini nusxalashdan qimmatroqqa tushadi, va o'zgartiradigan metodlarga baribir pointer kerak. Shuning uchun aksariyat kod *User, *Order, *Request uzatadi. Oddiy User esa nusxalashi arzon va hech qachon o'zgartirilmaydigan kichik shakllar uchun.

>_ Exercise

Sizning transkodlash quvuringiz navbatga qo'yib, atrofga uzatishi mumkin bo'lgan ishni yaratish uchun NewVideoJobni chaqiradi. Berilgan fayl nomi va maqsadli o'lchamni olib yuradigan *VideoJob qaytaradigan butun NewVideoJob funksiyasini yozing.

Talablar

  • Funksiyani func NewVideoJob(filename string, resolution int) *VideoJob signaturasi bilan yozing
  • Structni &VideoJob{...} bilan yarating, shunda pointer qaytarasiz
  • Filename va Resolutionni argumentlardan o'rnating
  • Pointerni qaytaring

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Pointerlar structlarda ham xuddi boshqa turdagidek ishlaydi, lekin Go sizga structni yaratayotganda uning manzilini olish va maydonlarga qo'lda dereferentsiya qilmasdan pointer orqali murojaat qilish imkonini beradi. Pointer structdan arzonroq nusxalanadigani uchun, aksariyat Go kodi structlarni pointer orqali uzatadi.

NEXT UP

The new Builtin