Sorunun geçmişi:
Go, belirgin bir değer mantığı (value semantic) ile tasarlanmıştır: neredeyse her şey, yapılar (struct) dahil, değer olarak iletilirken kopyalanır, ancak işaretçiler (pointer) ve dilimler (slice) iletilmez. Bu, akıl yürütmeyi (reasoning) basitleştirmiş ve güvenliği artırmıştır, ancak bir dizi "tuzağı" beraberinde getirmiştir.
Sorun:
Geliştiriciler, bir yapıyı bir fonksiyona ilettiklerinde değişikliklerin "dışarıda" görünmesini bekleyebilirler. Ancak, her şeyin (iç içe geçmiş alanlar dahil — değer olarak!) kopyalandığı gerçekleşir. Dilimler ve haritalar (map) için farklı bir davranış vardır; burada "konteyner" kopyalanırken "içerik" kopyalanmaz.
Çözüm:
Büyük yapıları, değişiklik bekleniyorsa, işaretçi (pointer) ile iletin. Dilim için yalnızca başlık (length, capacity, pointer) kopyalanır, içerik değil — orijinal dilimdeki değişiklikler dışarıda görünür (indeks aracılığıyla). Yapı için ise her şey kopyalanır:
type Point struct { X, Y int } func move(p Point) { p.X = 100 } func movePtr(p *Point) { p.X = 100 } func demo() { pt := Point{10, 10} move(pt) fmt.Println(pt.X) // 10 movePtr(&pt) fmt.Println(pt.X) // 100 }
Anahtar özellikler:
Fonksiyon içindeki yapıyı değiştirirseniz, orijinal değişir mi?
Hayır, eğer yapı değer olarak iletilmişse — değişiklikler yereldir.
type User struct {Name string} func f(u User) {u.Name = "Ann"}
Bir dilim içindeki öğeyi fonksiyon içinde değiştirirseniz, orijinal değişir mi?
Evet. Dilimler, ortak bir diziye "görünüm" (view) sağlar. Öğe değiştirilince, orijinal verileri de değiştirirsiniz.
func f(s []int) {s[0] = 99}
Fonksiyon içinde oluşturulmuş bir dilimi döndürürseniz ne olur?
Dilin "şapkası" kopyalanır, ancak temel dizi (underlying array) erişilebilir olmaya devam eder. Dışarıda bir referans tutulmazsa, veriler GC tarafından toplanabilir.
User yapısının işlenmesi fonksiyonda değer olarak yapıldı — değişiklikler geri ulaşmadı, hataları yakalamak zorlaştı.
Artıları:
Eksileri:
Büyük yapılar açıkça işaretçi ile iletilir ve dilimler her zaman davranışı yorumlanır veya kontrol edilir. Karışıklık yok, herkes değer mantığını bekler.
Artıları:
Eksileri: