```
panic: runtime error: invalid memory address or nil pointer dereference
```
Peki, ne oldu? Her şey aslında çok basit! Go’nun derleyicisi, bir yerlerde bir şeye ulaşmaya çalışırken "benim gidecek yerim yok" diyor ve panik yapıyor. Bu, Go'da bir bellek hatasının oluştuğu anlamına gelir, özellikle de nil işaretçisi (pointer) ile ilgili bir problem var demektir. Hadi, bu hatayı adım adım çözmeye çalışalım.
Nil Pointer Nedir?
Go dilinde, nil pointer'lar oldukça yaygındır. Bir pointer, başka bir veri değerinin bellekteki adresini tutar. Ama bir pointer, bir veriye işaret etmiyorsa ve buna erişmeye çalışırsanız, işte o zaman bu hata karşınıza çıkar. Nil pointer, "benim işaret ettiğim bir şey yok" anlamına gelir.
- Bir pointer, bir değişkeni işaret etmiyor (nil).
- Pointer'ı kullanarak bu işaretçiye erişmeye çalışıyorsunuz.
Örnek olarak, aşağıdaki basit Go kodunu gözden geçirelim:
package main
import "fmt"
type Person struct {
Name string
}
func main() {
var p *Person
fmt.Println(p.Name) // Nil pointer dereference
}
Yukarıdaki kodda `p` bir `Person` tipinin pointer'ıdır ve başlangıçta nil değeri taşır. `p.Name`'e erişmeye çalışmak, "panic: runtime error: invalid memory address or nil pointer dereference" hatasına yol açacaktır. Çünkü Go, nil olan bir pointer üzerinden veri erişmeye çalıştığınızda panik yapar.
Hata Nasıl Çözülür?
Bu hata ile karşılaştığınızda, dikkat etmeniz gereken ilk şey, pointer’ın her zaman geçerli bir değere işaret ettiğinden emin olmaktır. Bunu yapmak için, pointer'ı kontrol etmeden önce null (nil) olup olmadığını kontrol edebilirsiniz. Aşağıda bu hatayı nasıl düzeltebileceğinizi görebilirsiniz:
package main
import "fmt"
type Person struct {
Name string
}
func main() {
var p *Person
if p != nil {
fmt.Println(p.Name) // Bu kod artık çalışacak, çünkü nil kontrolü var.
} else {
fmt.Println("Pointer nil, değer yok!")
}
}
Bu çözümle birlikte, pointer’ın nil olup olmadığını kontrol ettikten sonra `Name` özelliğine erişmeye çalışıyoruz. Eğer `p` nil ise, bu kod hata vermez, sadece "Pointer nil, değer yok!" mesajını yazdırır.