ProgramlamaBackend geliştirici

Go'da değişmez (immutable) ve değiştirilebilir (mutable) veri yapılarıyla çalışma nasıl düzenlenir? Programlamada bunu dikkate almanın önemli olduğu örnekler verin.

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

Cevap

Go'da çoğu yerleşik veri türü (örneğin int, float, struct) — değiştirilebilir'dir, çünkü değer olarak geçirildiğinde tüm yapı veya değer kopyalanır. Ama bir ince nokta var: dilimler (slice), haritalar (map), kanallar (channel) — referans türleridir ve kendi iç verilerin depolanma mantığına sahiptir.

Temel türler:

x := 10 y := x // Burada x'in değerinin bir kopyası oluşturulur, x ve y birbirine bağlı değildir y = 20 // x 10'da kalır

Dilimler:

a := []int{1,2,3} b := a // aynı temel "alt diziye" referans b[0] = 100 // şimdi a[0] == 100

Bu önemli, çünkü bir fonksiyon veya yöntem bir yapı veya dilim aldığında, değişiklikler orijinal verileri etkileyip etkilemeyeceğine bağlı olarak veri türüne ve geçiş şekline (değer veya referans olarak) göre değişir.

Kandırmaca Soru

Soru: "Bir dilimi diğerine atarsanız, derin bir kopya mı alıyorsunuz yoksa her ikisi de aynı verilere mi işaret ediyor?"

Cevap: Basit dilim atamasında (b := a) — her ikisi de aynı temel diziyi işaret eder, ancak bağımsız uzunluk ve kapasiteye sahiptirler. Bir dilim üzerinden veri değişikliği, diğerinde görünür.

Örnek:

a := []int{1,2,3} b := a b[0] = 42 fmt.Println(a) // [42 2 3]

Derin bir kopya yapmak için copy kullanılır:

c := make([]int, len(a)) copy(c, a) c[0] = 99 fmt.Println(a) // [42 2 3], c — bağımsız bir kopya

Hikaye

Veri filtreleme servisi beklenmedik sonuçlar döndürmeye başladı: Bir geliştirici dilimleri birkaç fonksiyon arasında kopyalamadan geçirdi ve durumlarını değiştirdi. Farklı yerlerde dilimlerde yapılan değişiklikler nedeniyle uygulamanın mantığı bozuldu, verilerde tuhaf hatalar oluştu, uzun süre tespit edilemedi.


Hikaye

Yapı ile geçiş sonrası veri kaybı: Bir projede veri serileştirilirken, yapının zorunlu bir alanı yanlışlıkla silindi, çünkü nesne referans ile geçirildi, kopyası oluşturulmadı. Sonuç olarak, bu nedenle üretimde kritik bilgiler kayboldu.


Hikaye

Map ile eşzamanlı çalışma hatası: Geliştirici, değişikliklerin orijinalini etkilemeyeceğini düşünerek bir map'in referansını kopyaladı, bu diğer dillerde sık yaşanan bir durumdur. Sonuç olarak, farklı goroutine'lerde çalışırken veri yarışı oluştu ve uygulamanın çökmesine neden oldu.