GoDasturchi
The Nil Pointer That Slipped Through

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

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

  • GetAvatarURL funksiyasi u.Profile.AvatarURLga to'g'ridan-to'g'ri murojaat qiladi — agar u.Profile nil bo'lsa, bu qator nil ko'rsatgichning maydoniga kirishga urinib, PANIC qiladi
  • Bu xato faqat YANGI, hali profil yaratmagan foydalanuvchi uchun GetAvatarURL chaqirilganda 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'NGRA u.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

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

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

  • GetAvatarURL funksiyasi u.Profile.AvatarURLga to'g'ridan-to'g'ri murojaat qiladi — agar u.Profile nil bo'lsa, bu qator nil ko'rsatgichning maydoniga kirishga urinib, PANIC qiladi
  • Bu xato faqat YANGI, hali profil yaratmagan foydalanuvchi uchun GetAvatarURL chaqirilganda 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'NGRA u.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