The Nil Pointer That Slipped Through
Chetlab o'tgan nil ko'rsatgich
Pochtachini tasavvur qiling: u har bir uyga xat tashlaydi, lekin ba'zi uylarda pochta qutisi HALI o'rnatilmagan — faqat bo'sh joy bor. Agar pochtachi buni tekshirmasdan, "qutiga xat tashlash" harakatini har doim bajaraversa, qutisi yo'q uyda XATOGA yo'liqadi. Yaxshi pochtachi avval "bu yerda qutiga tashlaydigan joy bormi?" deb tekshiradi. Kodda ham xuddi shunday: "bu narsa mavjudmi" deb tekshirmasdan, uni ISHLATISHGA urinish — nil pointer xatosiga olib keladi.
Quyidagi Go kodini ko'ring — bu kod yangi funksiyani sinovdan o'tkazishni so'rab, review'ga yuborilgan: "Foydalanuvchining avatar rasmi URL'ini qaytaradi, agar profilda o'rnatilmagan bo'lsa, standart rasmni ko'rsatadi."
type User struct {
ID string
Name string
Profile *Profile // yangi foydalanuvchilarda hali yaratilmagan bo'lishi mumkin
}
type Profile struct {
AvatarURL string
Bio string
}
const defaultAvatarURL = "/static/default-avatar.png"
func GetAvatarURL(u *User) string {
if u.Profile.AvatarURL != "" {
return u.Profile.AvatarURL
}
return defaultAvatarURL
}Bu kod baxtli yo'lda (profil yaratilgan foydalanuvchi uchun) mukammal ishlaydi — Reading for Intent vs. Reading for Correctness darsidagi ma'noda, NIYAT to'g'ri: "profil bo'sh bo'lsa standart rasm". Lekin TO'G'RILIK nuqtai nazaridan muammo bor: Profile *Profile maydoni izohida aniq yozilgan — yangi foydalanuvchilarda Profile hali nil bo'lishi mumkin.
- •
GetAvatarURLfunksiyasiu.Profile.AvatarURLga to'g'ridan-to'g'ri murojaat qiladi — agaru.Profilenilbo'lsa, bu qatornilko'rsatgichning maydoniga kirishga urinib, PANIC qiladi - •Bu xato faqat YANGI, hali profil yaratmagan foydalanuvchi uchun
GetAvatarURLchaqirilganda ko'rinadi — testlarda ko'pincha faqat "to'liq" foydalanuvchi bilan sinaladi, shuning uchun bu xato OSON chetlab o'tiladi - •To'g'ri kod: avval
if u.Profile == nil { return defaultAvatarURL }deb tekshirish, SO'NGRAu.Profile.AvatarURLni tekshirish
Review'da bu turdagi xatoni topishning kaliti — struct ta'rifidagi izohga ('hali yaratilmagan bo'lishi mumkin') e'tibor berish, va HAR bir *Type ko'rsatgichni ishlatishdan oldin "bu HAR DOIM to'ldirilganmi, yoki ba'zan nil bo'lishi mumkinmi?" deb so'rash. Agar javob noaniq bo'lsa — bu review'da ANIQLASHTIRISH kerak bo'lgan savol.
Key Takeaway
Key Takeaway:
Har bir ko'rsatgich (pointer) maydoniga murojaat qilishdan oldin, u HAR DOIM to'ldirilganmi yoki ba'zan nil bo'lishi mumkinmi, deb so'rang. Bu xato baxtli yo'lda ko'rinmaydi — faqat "hali to'liq bo'lmagan" holatda, ko'pincha production'da chiqadi.
NEXT UP
The Error That Got Swallowed