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.
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.
panic: runtime error: invalid memory address or nil pointer dereferenceHimoya
Pointer nil bo'lishi mumkin bo'lgan har safar, dereferentsiya qilishdan oldin tekshiring.
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.Emailqaytaring - •
r.Usernil bo'lsa"anonymous"qaytaring - •Dereferentsiya qilishdan oldin himoyalaning; hech qachon nil pointer orqali murojaat qilmang
Stuck? Reveal a hint to help you.
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
$ go run main.go
Kodingizni ishga tushiring