Go Array ve Slice

Bu yazıda Go programlama dilindeki array ve slice tiplerinden bahsedeceğim

Array

Array sabit uzunluklu, belirli bir tipte, sıfır veya daha fazla elemanlı, birbiri ardına gelen dizidir. Sabit uzunluklu olması sebebiyle Go dilinde nadiren kullanılır.

Array ın kapasitesi oluşturulurken belirtilir ve sonradan değiştirilemez.

fruits := [4]string{}

Array in elemanları array oluşturulurken de girilebilir.

fruits := 2[]string{"Elma", "Armut"}

Array in her bir elemanının zaro value su array in tipinin zero value sudur.

fruits :=2[]string{} // " ", " "
numbers := 3[]int{} // 0, 0, 0

Birçok dilde olduğu gibi Go dilinde de array in ilk elemanı 0(sıfır) dan başlar

fruits := 2[]string{"Elma", "Armut"}
fmt.Println(fruits[0]) // Elma

len fonksiyonu array içinde kaç tane eleman olduğu bilgisini döner

f := [2]string{"Elma", "Armut"}
fmt.Println(len(f)) //2

Eğer array in elemanlarının tipi karşılaştırılabilir ise array de karşılaştırılabilirdir ve == operatörü ile eşit, != operatörü ile eşit değil karşılaştırması yapabiliriz.

s1 := [2]string{"Elma", "Armut"}
s2 := [2]string{"Elma", "Armut"}

if s1 == s2{
    fmt.Println("2 array eşit")
}

//2 array eşit

Bir fonksiyon çağırıldığı zaman, her bir argümanın değerinin kopyası karşılık gelen parametre değerine atanır. Yani fonksiyon kopyayı alır orijinali değil. Fonksiyonlara argüman olarak büyük array ler geçmek efektif değildir ve fonksiyonun yapacağı değişiklikler kopyayı etkiler, orijinali değil.

Fonksiyona array ı işaret eden pointer argüman olarak geçilebilir. Bu sayede orijinal array üzerinde değişiklik yapılabilir. Fakat yine de array ler sabit uzunluklu olmaları sebebiyle efektif değildirler.

Go dilinde array ler fonksiyon parametresi ve dönüş değeri olarak nadiren kullanılırlar. Bunun yerine slice tercih edilir

Slice

Slice değişken uzunluklu, belirli bir tipte, sıfır veya daha fazla elemanlı, birbiri ardına gelen dizidir. Slice array e benzer fakat slice tanımlarken uzunluk belirtmeyiz

s := []string{}
i := []int{}

len fonksiyonu slice ın kaç elemana sahip olduğu söyler, cap fonksiyonu ise slice ın kapasitesini, bir başka deyişle slice ın kaç tane elemana sahip olabileceğini söyler. Slice aynı zamanda make anahtar sözcüğü ile de oluşturulabilir

s := make([]string, 1, 3)

make slice oluşturulurken length ve capacity değerlerini verebilmemizi sağlar

Yukarıdaki örnekte her ne kadar ekstra kapasite allocate etmiş olsak da, değer atayana kadar ekstra kapasiteye erişim hakkımız yoktur.

Bir slice ın subetini aldığımızda eğer subseti mutate edersek, orijinal slice ı da mutate etmiş oluruz. Bunun önüne geçmek içi copy kullanabiliriz

original := []string{"elma", "armut"}
ref := original
dup := make([]string, len(original))
copy(dup, original)

ref[0] = "portakal"
original[1] = "muz"
fmt.Println("original: ", original)
fmt.Println("ref:      ", ref)
fmt.Println("dup:      ", dup)

//original:  [portakal muz]
//ref:       [portakal muz]
//dup:       [elma armut]