CodeBlanks Logo Icon CodeBlanks

Nil pointer

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 dereference

Bu 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

main.go
package main

import "fmt"

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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ü

Soru
if p ____ nil {
    fmt.Println(*p)
}
Cevap
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

Başlangıç bölümündeki tüm dersler