Go'da gömülü fonksiyonlar append, len ve cap, dilimler (slices) ile çalışırken önemli bir rol oynar.
Örnek:
arr := []int{1,2,3} arr2 := append(arr, 4) // arr2, arr'ın kapasitesine bağlı olarak aynı veya yeni bir backing array'de olabilir.
İncelikler:
Bir dilimin "kesilmesi" ve append ile bir eleman eklenmesi durumunda ne olur? Bu orijinal dizi üzerinde bir etki yapar mı?
Cevap: Eğer cap uygunsa, append elemanı orijinal dizinin "sonuna" yazar ve değişiklikler aynı diziyi referans alan tüm dilimlerde görünür.
Örnek:
a := []int{1,2,3,4} b := a[:2] // [1 2], len=2, cap=4 b = append(b, 10) // a değişir: a -> [1, 2, 10, 4]
Hikaye
Ekip, alt dilimde elemanlar ekledi ve beklenmedik bir şekilde ana dizideki veriler değişti - bu, iş mantığında uyumsuzluklara ve kullanıcılar arasında görev dağılımında zor hata ayıklama sorunlarına neden oldu.
Hikaye
Büyük bir dilimde append'i tekrar çağırdıklarında, yeni dizinin her zaman yeniden tahsis edileceğini umuyorlardı, ancak gerçekte sistemin birkaç parçası aynı "backing array" ile çalışmaya devam etti ve bu da yarış durumu ve veri bozulmasına yol açtı.
Hikaye
Bir geliştirici, make ile sabit boyutlu bir dilim tahsis etti ama argümanları yer değiştirdi: make([]int, cap, len). Sonuç olarak, kapasiteye dayalı olarak tasarlanan mantık beklenmedik bir şekilde uzunluğa çalıştı ve s[0:len] sınırlarını aşarken panik yarattı.