Dilimler (Slices)
slice ifadeleri array ifalerinin bir segmenti(alt bölümü)dür. array ifadelerinde olduğu gibi slice ifadeleri de indekslenebilir(numaralandırılabilir) ve belirli bir uzunlukları vardır. array ifadelerinden farklı olarak bu uzunluklar değiştirilebilirler.
Bir slice ifadesi aşağıdaki şekilde tanımlanır.
var slicename [slicelength]slicetype
Bir örnek ifade ile göstermek gerekirse :
package main
func main(){
var x []float64
fmt.Print(len(x))
}
Yukarıdaki ifadede sıfır öğeli bir slice ifadesi oluşturuldu. slice ifadeleri oluşturulurken değer ataması yapılmaz ise slice ifadesinin uzunluğu sıfır kabul edilir.
Diğer bir slice oluşturma yöntemi ise make() yardımıyla slice oluşturmaktır.
func main(){
myslice := make([]int)
}
slice ifadesini oluşturken eğer alacağı değerleri de belirlemek istiyorsanız {} ifadesini slice ifadesinin sonuna eklenmeniz gerekir.
func main(){
myarr := make([3]int{22,24,32})
// index 0 'dan index 2 değerine kadar
myslice := [0:2]
fmt.Print(myslice)
}
Slice ifadelerine Eleman eklenmesi
slice ifadelerine eleman ekleme işlemleri append() fonksiyonu aracılığıyla sağlanır.
func main() {
slice1 := []int{1,2,3}
slice2 := append(slice1, 4, 5)
fmt.Println("slice1 :" , slice1)
fmt.Println("slice2 :" , slice2)
}
append() fonksiyonu slice1 isimli ilk slice ifadesini temel alarak üstüne 4,5 değerlerini ekleyip yeni bir slice ifadesi olan slice2 ifadesini oluşturur.
Yukarıdaki ifadenin çıktısı :
slice1 : [1 2 3]
slice2 : [1 2 3 4 5]
şeklinde olacaktır.
Mevcut bir slice ifadesine tekrar atama yapmak için aşağıdaki şekilde bir yazım gerçekleştirmeniz gerekir.
func main(){
cities := []string{}
// WARN: Tanımlama sonrasında değer atamada : işareti kullanılmaz!
cities = append(cities, "Bursa", "Edirne", "İstanbul")
fmt.Println(cities)
}
DİKKAT:
citiesifadesinde tanımlama sonrasındaappend ()fonksiyonu kullanırken yalnızca=kullandık. değişken tanımlama sonrasında yapılan işlemlerde aynı değişken için:işareti kullanılmaz!
Yukarıdaki ifadeyi çalıştırdığımızda aşağıdaki çıktıyı elde ederiz :
["Bursa", "Edirne","İstanbul"]
slice ifadelerinin kopyalanması
slice ifadelerini kopyalamak için copy() isimli fonksiyon ifadesini kullanırız.
func main() {
slice1 := []int{1,2,3}
slice2 := make([]int, 2)
copy(slice2, slice1)
fmt.Println("slice1:", slice1)
fmt.Println("slice2:", slice2)
}
Bu fonksiyon slice1 isimli bir slice oluşturur ve slice2 ismiyle oluşturulan 2 adet değer alabilen fonksiyona slice ifadesini kopyalar. İki adet değer alabileceği için slice1 isimli slice öğelerinden 1,2 öğelerini kendi içine kopyalar. Kod çalıştırıldığında aşağıdaki sonuç elde edilir.
slice1: [1 2 3]
slice2: [1 2]
Bir slice ifadesinin içindeki değerleri fmt.Printf() aracılığıyla görüntülemek istedimizde %q argümanını kullanırız.
func main() {
cities := []string{}
cities = append(cities, "Edirne", "Bursa")
fmt.Printf("%q", cities)
}
Yukarıdaki işleme ait çıktı şu şekilde olacaktır:
["Edirne" "Bursa"]
Slice ifadelerini birbirine direkt olarak eklemek istedimizde aşağıdaki yazım biçimiyle bu işlemleri gerçekleştiriz.
func main() {
cities := []string{"Lüleburgaz", "Babaeski"}
otherCities := []string{"Havsa", "Uzunköprü"}
/* ... - ellipsis işaretiyle otherCities isimli slice
ifadesinin her elemanını tek tek
string olarak eklemek istediğimizi belirttik
*/
cities = append(cities, otherCities...)
fmt.Printf("%q", cities)
}
Çıktı şu şekilde olacaktır :
["Lüleburgaz" "Babaeski" "Havsa" "Uzunköprü"]
... (ellipsis) işareti ile dilimin her elemanını tek tek eklemek istediğimizi belirttik. Eğer böyle belirtmemiş olsak string ifadeleri içeren bir slice a slice ifadesi eklemeye çalışacağımız için hata mesajı alırdık. otherCities isimli slice içindeki string ifadelerini teker teker string ifadeleri olarak eklememiz için ifadeden sonra ... ellipsis işareti kullanmamız gerekir.
Slice ifadelerinin sıralanması
slice ifadelerinin sıralanması sırasında sort.Slice() isimli bir fonksiyon kullanılır.
func main(){
cities := []string{
"Bursa",
"İstanbul",
"Çanakkale",
"Balıkesir",
"Tekirdağ",
"Edirne",
"Kırklareli",
"Yalova",
"Kocaeli",
"Sakarya",
}
sort.Strings(cities)
// before sort cities
fmt.Printf("%q", cities)
}
Bu ifadeyi çalıştırdığımızda sort.Strings() fonksiyonu yardımıyla string ifadeleri alfabetik olarak dizilecektir. Burada dikkat etmeniz gereken konu Çanakkale ve İstanbul ifadelerindeki karakterler Türkçe karakterler olduğu için sıralamaya dahil edilmeyip sıralamanın en sonuna eklenir. Programlama dillerinde Türkçe karakterlerle sıralama işlemi yaptığınızda benzer durumlarla karşılaşabilirsiniz. Kodun çıktısı aşağıda verilmiştir.
["Balıkesir" "Bursa" "Edirne" "Kocaeli" "Kırklareli" "Sakarya" "Tekirdağ" "Yalova" "Çanakkale" "İstanbul"]%
Diğer ifadeleri sıralamak için sort kütüphanesindeki :
- sort.Strings()
- sort.Ints()
- sort.Float64s()
ifadelerini de pkg.go.dev - sort sayfasından araştırabilirsiniz.
slice ifadelerinin kapasitelerinin ölçülmesi
slice ifadelerinin kapasitelerinin ölçülmesi için cap() isimli bir fonksiyon kullanırız. cap() fonksiyonu ile len() fonksiyonunun farkı, cap() dizinin alabileceği azami eleman miktarını belirtirken, len() fonksiyonu dizinin mevcut eleman miktarını belirtir.
func main(){
firstslice := [4]int{12, 23, 44}
// myslice
myslice := firstslice[0:2]
fmt.Printf("%v \n", myslice)
fmt.Printf("Capacity : %d \n", cap(myslice))
fmt.Printf("Length: %d \n", len(myslice))
}
Yukarıdaki ifade çalıştırıldığında aşağıdaki ekran çıktısı ile karşılaşılır.
[12 23]
Capacity : 4
Length: 2
nil slice ifadeleri
Bir slice ifadesi oluşturulurken eğer sayısal bir değer belirtilmezse ifade nil yani elemansız kabul edilir. Bu slice ifadelerinin veri uzunluğu sıfır ve kapasiteleri sıfırdır.
func main() {
var z []int
fmt.Printf("Slice: %v \n", z)
fmt.Printf("len : %d \n", len(z))
fmt.Printf("cap : %d \n", cap(z))
if z == nil {
fmt.Println("Z is nil!")
} else {
fmt.Println("This is not nil!")
}
}
Bu kodun çıktısı aşağıdaki şekilde olacaktır.
Slice: []
len : 0
cap : 0
Z is nil!