copy(dst, src []T) int fonksiyonu, src içindeki elemanları dst'ye kopyalar.
min(len(dst), len(src)).src[i]'nin elemanları dst[i]'ye kopyalanır.İncelikler ve sınırlamalar:
dst, src'dan daha kısa bir boyuta sahipse, yalnızca dst'nin boyutunun izin verdiği kadar veri kopyalanır.dst'nin kapasitesi boyutundan büyükse, copy dilimi genişletir mi? — Hayır, yalnızca len(dst) hedef olarak kabul edilir. Genişletmek için önceden append kullanın.Örnek:
a := []int{1,2,3,4,5} b := make([]int, 3) copy(b, a) // b: [1 2 3]
Üst üste gelme:
x := []int{1,2,3,4} copy(x[1:], x[:3]) // [1 1 2 3]
copy() dilimin boyutunu artırmak için kullanılabilir mi? Eğer daha büyük kapasiteye ancak yeterinden az boyuta sahip bir hedef dilimi copy'e verirseniz ne olur?
Cevap:
dst = dst[:newLen] ile genişletin, ardından copy() kullanın.Özellikle belirgin olmayan örnek:
a := []int{1,2,3} b := make([]int, 0, 5) copy(b, a) // b boş kalacak çünkü len(b)==0 b = b[:len(a)] copy(b, a) // artık b: [1,2,3]
Hikaye
Proje, bir dilimden diğerine veri kopyalarken, copy'nin dst'nin boyutunu otomatik olarak genişleteceğini düşündü. Bu olmadı, elemanlar kopyalanmadı, sonuçta API'den sıfır veriler alındı. Hata, dilimlerin uzunluklarını karşılaştırdıktan sonra bulundu — sorun, dst'nin büyük bir kapasiteye sahip olması ama boyutunun 0 olmasıydı.
Hikaye
Mikroservisin bir kısmı, üst üste gelen dilimlerle çalışırken, copy'nin her zaman düzgün çalışacağını düşünen hata yaptı. Sonuç olarak, ileri kopyalama orijinal verileri bozdu, tamponlarla çalışırken "görünmeyen" hatalar ortaya çıktı. Geçici bir tampon kullanarak çözüldü (copy(tmp, src), sonra copy(dst, tmp)).
Hikaye
Bir mühendis, dilimlerden veri sıralamak için copy kullanarak diziyi optimize etti. dst'nin boyutunu düzelteceğini bekliyordu. Olmadı ve panik ve anlamlı verilerin sınırını aşma sorunları ortaya çıktı — kopyalama öncesinde dilimin boyutunu doğru şekilde değiştirmeyi unuttular.