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:
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:
fmt.Println((*u).Name) // buni qilmangDereferentsiya qiling, keyin maydonni oling. Go bu qadamni siz uchun bajaradi:
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) *VideoJobsignaturasi bilan yozing - •Structni
&VideoJob{...}bilan yarating, shunda pointer qaytarasiz - •
FilenamevaResolutionni argumentlardan o'rnating - •Pointerni qaytaring
Stuck? Reveal a hint to help you.
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
$ go run main.go
Kodingizni ishga tushiring