GoDasturchi
Nil Pointer Safety

Nil Pointer Safety

Nil pointer xavfsizligi

*User qaytaradigan qidiruv sizga haqiqiy foydalanuvchini yoki nilni berishi mumkin. Kompilyator ikkalasini ham bir xil ko'radi. Runtime esa yo'q.

example.go
user := db.FindUser(id)
fmt.Println(user.Name) // user nil bo'lsa qulaydi (panic)

Istalgan pointerning nol qiymati nil: u hech narsaga ishora qilmaydi. Unga . yoki * orqali murojaat qilsangiz, kompilyatsiya vaqtida ogohlantirishsiz, runtime panic olasiz.

example.go
panic: runtime error: invalid memory address or nil pointer dereference

Himoya

Pointer nil bo'lishi mumkin bo'lgan har safar, dereferentsiya qilishdan oldin tekshiring.

example.go
user := db.FindUser(id)
if user == nil {
	http.NotFound(w, r)
	return
}
fmt.Println(user.Name)

*T qaytarish — "bu mavjud bo'lmasligi mumkin" uchun Go andazasi. Qidiruv natija bermasligi, o'rnatilmagan struct maydoni, yalang'och var p *T: ularning har biri sizga nil berishi mumkin, va chaqiruvchining vazifasi — murojaat qilishdan oldin tekshirish.

>_ Exercise

UserLabel so'rovning foydalanuvchisidan ko'rsatish yorlig'ini yasaydi. U r.User.Emailni to'g'ridan-to'g'ri o'qiydi, shuning uchun foydalanuvchisiz so'rov (User nil) metod ishga tushgan zahoti qulaydi. Metodni tuzating, shunda yo'q foydalanuvchi qulash o'rniga yorliq qaytarsin.

Talablar

  • So'rovda foydalanuvchi bo'lsa r.User.Email qaytaring
  • r.User nil bo'lsa "anonymous" qaytaring
  • Dereferentsiya qilishdan oldin himoyalaning; hech qachon nil pointer orqali murojaat qilmang

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Nil pointer hech narsaga ishora qilmaydi, shuning uchun uni dereferentsiya qilish qulaydi (panic). Murojaat qilishdan oldin if p != nil bilan himoyalaning.

NEXT UP

Find or Nil

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Nil Pointer Safety

Nil pointer xavfsizligi

*User qaytaradigan qidiruv sizga haqiqiy foydalanuvchini yoki nilni berishi mumkin. Kompilyator ikkalasini ham bir xil ko'radi. Runtime esa yo'q.

example.go
user := db.FindUser(id)
fmt.Println(user.Name) // user nil bo'lsa qulaydi (panic)

Istalgan pointerning nol qiymati nil: u hech narsaga ishora qilmaydi. Unga . yoki * orqali murojaat qilsangiz, kompilyatsiya vaqtida ogohlantirishsiz, runtime panic olasiz.

example.go
panic: runtime error: invalid memory address or nil pointer dereference

Himoya

Pointer nil bo'lishi mumkin bo'lgan har safar, dereferentsiya qilishdan oldin tekshiring.

example.go
user := db.FindUser(id)
if user == nil {
	http.NotFound(w, r)
	return
}
fmt.Println(user.Name)

*T qaytarish — "bu mavjud bo'lmasligi mumkin" uchun Go andazasi. Qidiruv natija bermasligi, o'rnatilmagan struct maydoni, yalang'och var p *T: ularning har biri sizga nil berishi mumkin, va chaqiruvchining vazifasi — murojaat qilishdan oldin tekshirish.

>_ Exercise

UserLabel so'rovning foydalanuvchisidan ko'rsatish yorlig'ini yasaydi. U r.User.Emailni to'g'ridan-to'g'ri o'qiydi, shuning uchun foydalanuvchisiz so'rov (User nil) metod ishga tushgan zahoti qulaydi. Metodni tuzating, shunda yo'q foydalanuvchi qulash o'rniga yorliq qaytarsin.

Talablar

  • So'rovda foydalanuvchi bo'lsa r.User.Email qaytaring
  • r.User nil bo'lsa "anonymous" qaytaring
  • Dereferentsiya qilishdan oldin himoyalaning; hech qachon nil pointer orqali murojaat qilmang

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Nil pointer hech narsaga ishora qilmaydi, shuning uchun uni dereferentsiya qilish qulaydi (panic). Murojaat qilishdan oldin if p != nil bilan himoyalaning.

NEXT UP

Find or Nil