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