Go'da işaretçi, başka bir değişkenin adresini saklayan bir değişkendir. Bazı dillerden farklı olarak, Go'da işaretçi aritmetiği yapılamaz, bu da onları daha güvenli hale getirir. Go'da işaretçiler sıkça aşağıdaki durumlar için kullanılır:
Go'da C++ gibi görünen bir referans tipi desteği yoktur, ancak dilim ve haritalar doğası gereği referanslıdır ve çoğu zaman değer olarak aktarılır.
package main import "fmt" type User struct { Name string } func changeNameByValue(u User) { u.Name = "Vasya" } func changeNameByPointer(u *User) { u.Name = "Petya" } func main() { user := User{Name: "Ivan"} changeNameByValue(user) fmt.Println(user.Name) // Ivan changeNameByPointer(&user) fmt.Println(user.Name) // Petya }
Go'da işaretçiler sabitler veya literal değerler gösterebilir mi?
Doğru cevap: Hayır, Go'da doğrudan bir sabitin veya literalın adresini almak mümkün değildir. Adres sadece bir değişkenden alınabilir:
x := 5 p := &x // TAMAM p2 := &10 // Derleme hatası
Bu genellikle böyle bir şeyin mümkün olduğu dillerle karıştırılır.
Hikaye
Bir projede bir geliştirici, bir dilimi işaretçi aracılığıyla güvenle değiştirebileceğini düşünerek bir dilimin bir elemanına referans vermeye çalıştı. Ancak yanıldı: dilim kendisi zaten bir işaretçi içerir, ancak append() işlemi sonrasında alt dizinin adresi değişir ve değişiklikler her zaman temel veriler üzerinde yansıtılmaz. Bu, zor tespit edilen hatalara yol açtı (veriler "kayboldu").
Hikaye
Projede, bir döngüdeki yerel değişkenlerin işaretçilerinden oluşan bir liste oluşturuldu ve döngüden çıktıktan sonra tüm işaretçiler aynı değişkene (döngü değişkenine) işaret ediyordu. Hata, üretimdeki çökmeden sonra fark edildi.
Hikaye
Geliştirici yanıltıcı bir şekilde işaretçi atamanın önceki nesneyi bellekten serbest bıraktığını düşündü ve açıkça işaretçiyi nil'e atadı, GC'den hemen işlem yapmasını bekleyerek. Uygulamada Go'daki çöp toplayıcı, nesneleri temizlemenin ne zaman yapılacağına kendisi karar verir ve referansların erken bulanıklaştırılmasını göz ardı eder. Bu, bellek serbest bırakılmasını zamanında bekleyen yerlerde bellek sızıntılarına yol açtı.