ProgramlamaBackend geliştirici

Go'da işaretçilerle (pointers) çalışmanın özelliklerini açıklayın: onları ne zaman kullanmalıyız, diğer dillerdeki referanslardan ne gibi farkları vardır ve kullanımlarıyla ilgili hangi tipik tuzaklar bulunmaktadır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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:

  • Büyük yapıların fonksiyonlara aktarılması (kopyalanmaması için).
  • Dış bir fonksiyondan nesneyi değiştirmek için.
  • Karmaşık veri yapıları (örneğin, listeler, ağaçlar) gerçekleştirmek için.

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.

İşaretçi ve değer ile aktarım örneği:

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 }

Kandırmaca soru.

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.

Konunun incelikleri hakkında bilgi eksikliğinden kaynaklanan gerçek hata örnekleri.


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ı.