Nil pointer
- Go kursu
- Başlangıç
- Ders 67/90
- 4 dk
Nil pointer kavramını ve güvenli kullanımı öğrenirsin.
Nil pointer
Hiçbir şeyi göstermeyen işaretçi nil'dir. Nil bir işaretçiyi dereference etmek programı çökertir:
var p *int
fmt.Println(p == nil) // true
fmt.Println(*p) // panic: invalid memory address or nil pointer dereferenceBu yüzden dışarıdan gelen ya da isteğe bağlı olan işaretçiler kullanılmadan önce kontrol edilir.
İsteğe bağlı değer olarak nil
İşaretçinin nil olabilmesi, "değer yok" durumunu ifade etmek için kullanılır. Örneğin bulunamayan ürün için nil döndürmek:
func bul(urunler []Urun, ad string) *Urun {
for i := range urunler {
if urunler[i].Ad == ad {
return &urunler[i]
}
}
return nil
}
if u := bul(liste, "silgi"); u != nil {
fmt.Println(u.Fiyat)
}Hata ayrıntısı gerekiyorsa nil yerine (Urun, error) döndürmek daha açıklayıcıdır.
Uygulama Güvenli okuma
degerVeya(p *int, varsayilan int) int yaz: p nil ise varsayilan, değilse *p döndürsün. x := 7 için degerVeya(&x, 0) ve degerVeya(nil, -1) sonuçlarını tek satırda yazdır.
Başlangıç kodu
package main
import "fmt"
func main() {
// buraya yaz
}Örnek çözüm
package main
import "fmt"
func degerVeya(p *int, varsayilan int) int {
if p == nil {
return varsayilan
}
return *p
}
func main() {
x := 7
fmt.Println(degerVeya(&x, 0), degerVeya(nil, -1))
}Beklenen çıktı
7 -1
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Nil işaretçiyle bir struct alanına erişmek (<code>var u *Urun; u.Ad</code>) ne yapar?
- Derlenmez
- panic üretir Doğru cevap
- Boş string döner
- nil döner
Açıklama: u.Ad aslında (*u).Ad demektir; u nil olduğu için çalışma anında nil dereference panic'i oluşur.
2 Nil kontrolü
if p ____ nil {
fmt.Println(*p)
}
if p != nil {
fmt.Println(*p)
}
Açıklama: p != nil iken dereference güvenlidir.
3 Durum ve sonuç
| Kavram | Anlamı |
|---|---|
var p *int |
nil |
*p (p nil) |
panic |
p == nil |
true |
bul(...) bulamazsa |
nil döner |