[*] Bu blogda Afyonkarahisar ilimizi dalgınlığıma geldiği için Afyon olarak yazmışım. Normalde böyle şeylere çok dikkat ederim; kusura bakmayın.
Listeler yani Array'ler, adından da anlayacağınız üzere verileri bir listelemeye ve bunları bir listede tutmaya yarar. Örneğin 2 sayfa düşünelim ve ilk sayfada plakalar, ikinci sayfada da iller yazıyor olsun. İşte, aslında bu sayfalar birer listedir. Biz, programlama yaparken verileri bu şekilde ayırdığımız zaman hem bakımı ve verileri yönetmesi kolaylaşır hem fazladan kod yazmamıza gerek kalmaz yani esnek bir kod yazmış oluruz hem de depolama dostu bir kod yazmış oluruz. Python gibi bazı programlama dillerinde bir liste içerisinde istediğiniz veri tipinde veriler saklayabilirsiniz. Yani bir listede hem int, hem float hem de string değerler barındırabilirsiniz. Fakat Go'da böyle bir şeye müsaade yoktur; veri tiplerine özel listeler oluşturmamız gerekir. Bir örnek verelim.

Şehir ismi yazınca plaka numarası, plaka numarası yazınca şehir ismi gelecek şekilde bir program yazacağımızı düşünelim. Eminim, yukarıdaki gibi bir manyaklık yapmak istemezsiniz. Hem şöyle düşünün: şehirleri tanımlıyoruz ama plakaları nasıl tanımlayacağız; sayı ile başlayan değişken tanımlayabilir miyiz? Elbette hayır, sorunlar çıkmaya başladı.
Şimdi bir Array'in nasıl tanımlandığına ve elemanların nasıl yazıldığına bir bakalım.
Yukarıda gördüğünüz gibi listenin değişken ataması normal, bildiğimiz şekilde oldu: 'iller :='.
Bu tanımlamadan sonra bir köşeli parantez açıp o liste kaç elemanlıysa onu yazıyoruz. Ben örnek olması bakımından 3 il yazdım ama gerçek bir projede o köşeli parantez içerisine tabii ki 81 yazmanız gerekir. Kodumuzun şu anki hâli: 'iller := [3]'
Bunu yaptıktan sonra listenin veri tipini belirtmek zorundayız. Bu belirtmeyi herhangi bir boşluk olmadan yapmak zorundayız ve lütfen unutmayın: "veri tipini ne olarak belirtirseniz elemanları da o tipte yazmak zorundasınız." Kodumuzun son hâli: 'iller := [3]string'
Son olarak bir süslü parantez açıp elemanlarımızı giriyoruz. Bunu yaparken her elemanı birbirinden virgül ile ayırıyoruz; unutmayalım. Kodumuzun son hâli: 'iller := [3]string{"adana", "adıyaman", "afyon"}'
Çıktıya baktığınız zaman hem daha temiz, daha düzenli hem de daha anlaşılır bir çıktı olduğunu görüyoruz; sınıflandırılmış veriler. Kodun kendisine baktığımızda ise hem daha sade hem de daha işlevli kodlar yazdığımızı görüyoruz.
Şimdi, programlamada bizim 'indeks' dediğimiz bir yapı vardır. Burada biz, saymaya 1'den değil, 0'dan başlarız. Örneğin iller := [3]string{"adana", "adıyaman", "afyon"} şu kodumuzun ilk elemanı yani sıfırıncı indeksi Adana'dır. Bilgisayar da bunu böyle okur. Şimdi bir örnek yapalım ve bu örnek ile liste içerisinden bir elemanın nasıl çağırıldığını görelim.

Yukarıdaki gibi yapıyoruz. Liste içerisinde hangi elemanı istiyorsanız o elemanın indeksini yazmanız gerekir ve bunu, köşeli parantezler ile yapabilirsiniz: 'iller[0]'
Evet, şu an 3 elemanlı bir listemiz var ama bilgisayar bunu böyle anlamıyor. Bilgisayar, sayma işine sıfırdan başlıyor. Dolayısıyla biz, listeden ilk elemanı çağırmak istediğimizde bunu 'iller[1]' yapmak yerine 'iller[0]' yapmak zorundayız. Eğer 'iller[1]' şeklinde yazmış olsaydık bize, 'Adıyaman' sonucunu verecekti.

Kırmızı kutu içerisine bakalım. 'iller[3]' şeklinde bir şey yazmışız. Normal şartlarda bu komutun bize, listedeki son elemanı vermesini bekleriz ama gördüğünüz gibi hata aldık. Go bize, 'üçüncü indekste bir şey tanımlı değil/üçüncü indeks sınırlar dışında' şeklinde bir mesaj veriyor. İşte, indeks mantığı ve listeden eleman çağırma mantığı tam olarak bu şekildedir.
Liste tanımlamanın bir başka yolunu daha göstermek isterim.

Yukarıdaki gibi ilk önce değeri olmayan ama boyutu belli olan bir liste tanımladık. Listenin elemanlarını ise daha sonra tanımladık.
Liste tanımlamanın iki yolunu az önce gördük. Bunun yanında iki farklı şekilde de bu işi yapabiliyoruz; eleman sayısı belirtmeden.

Yukarıdaki koda dikkat edin. İlk liste tanımlamamızda köşeli parantezler içerisine listenin kaç elemanlı olduğunu belirttik. İkinci kısma baktığımızda, içerisine hiçbir şey yazmadığımızı görüyoruz ve üçüncü kısımda '...' şeklinde bir ifade görüyoruz. Go, bize hiçbir şekilde hata vermedi; hepsini çalıştırdı.
Yani liste tanımlarken eleman sayısını belirtmemize gerek yoktur; Go, bunu anlayacaktır. Fakat eğer bir liste gerçekten uzunsa (örneğin 81 il) bunu belirtmekte fayda olabilir. Çünkü listenin uzunluğuna bağlı olarak içerisinde elemanları başka bir yazılım geliştirici okuyunca anlamayacaktır. Bununla birlikte o yazılım geliştirici, listede kaç eleman olduğunu bilemeyeceği için eleman çağırma konusunda sıkıntıya düşecektir.
İşte, bu tip bir sıkıntı için neredeyse bütün programlama dillerinde bulunan 'len()' fonksiyonu vardır. Siz tabii yine de listenin uzunluğunu belirtin :).

'len()' fonksiyonu, 'length' yani 'uzunluk' kelimesinden gelir. Yukarıda gördüğünüz gibi kullanılır ve listedeki eleman sayısını (indeks değil) belirtir. İsterseniz bunu daha az karışık şekilde de yazabilirsiniz:

elemanlar değişkenine len(iller) diyerek iller listesinin uzunluğunu yani kaç elemanlı olduğunu atadık. Daha sonra fonksiyonları iç içe yazmak yerine sade bir şekilde fmt.Println(elemanlar) şeklinde yazdık.
Şu ana kadar liste tanımlamayı, len() fonksiyonunu ve for döngüsünü öğrendik. İsterseniz bu öğrendiklerimiz ile plakaları ve onlara karşılık gelen illerimizi otomatik olarak yazdıralım.

Önce i'ye 0 değerini atadık. Daha sonra 'i, iller listesinin uzunluğundan küçükse i'yi birer birer artır' dedik. Son olarak plakaları ve illeri yazdırdık. 'break' komutu kullanmadık, döngü nasıl durdu? 'i, iller listesinin uzunluğundan küçükse i'yi birer birer artır' cümlesine bakalım. i zaten 0 değerini almış ve her turda bir artıyor. i değeri iller listesinin uzunluğuna erişince kendisi durdu.
Slice/Slicing
Bu konu içerisine dahil edebileceğimiz ve ismi 'Slice/Slicing' veya 'Dilim/Dilimleme' olan bir konumuz var. Bir array içerisindeki elemanların belli bir kısmını almamıza yarar; adı üstünde dilimlememize olanak tanır. Örneğin birkaç il yazalım ve sadece plakası 9 olan ile kadar ekrana yazdıralım. Bunu, 'fmt.Println(iller[0:8])' şeklinde yapabiliriz.

Yukarıda, 10 adet il ve 10 adet plaka bilgisini tutan iki Array oluşturduk. Hemen aşağı baktığımızda iller[0] şeklinde bir kullanım yerine iller[0:8] şeklinde bir kullanım yapmışız. Burada, 10 adet elemanımız olmasına rağmen indeks konusunu unutmuyoruz ve ilk eleman için 0 yazıyoruz.
Şimdi, A harfi ile başlayanları sıfırdan başlayarak okumayı deneyin; bu şekilde sayınca 7 adet il olduğunu görüyoruz. Fakat biz iller[0:8] şeklinde yazdık yani oraya 8 değerini verdik. Bunun nedeni, slice mantığında son değerin dahil olmamasından kaynaklanır. Aslında fmt.Println(iller[0:8]) kodunun anlamı, "iller Array'i üzerindeki elemanlar içerisinden ilk elemandan sekizinci elemana kadar al ve yazdır ama sekizinciyi yazdırma."
Burada, bir Array içerisinde en baştan balayarak dilimleme yapacaksanız ilk değeri yazmanıza gerek yoktur. Az önce [0:8] yazdık ve bunun anlamını artık biliyoruz. Bir de sadece [:8] şeklinde bir kulllanım vardır ki bu, aynı şeydir. Hemen deneyelim, yine aynı sonucu alacağımızı göreceksiniz.

Bununla beraber [4:] şeklinde bir kullanımımız da mevcuttur. Bunun anlamı, "Dördüncü indeksli eleman dahil ondan sonra gelen her şeyi al." şeklindedir, bakalım.

Yukarıdaki kodda gördüğünüz gibi bu işlem; dördüncü indekse kadar almadı, sonrasında dördüncü dahil hepsini aldı ve yazdırdı.
Türkçe'ye 'eklemek, iliştirmek' olarak çevirebileceğimiz bu fonksiyon, bir Array'a eleman eklememize olanak tanır. Örneğimizi görüp öyle devam edelim.

Yukarıdaki görselde kutuların renk uyumuna dikkat etmenizi istiyorum. Önce kırmızı kutulara bakalım.
Zaten iki adet Array oluşturmuştuk. Kırmızı kutu içerisine aldığım kısımda bu iki Array'i yazdırıyoruz ve çıktıya baktığımızda normal bir şekilde geldiğini görüyoruz.
Daha sonra turkuaz kutuya baktığınızda append() diye bir şey kullandığımızı fark etmişsinizdir. append() dedikten sonra parantezlerin içerisine ilk önce hangi Array'e eleman ekleyecekseniz o Array'in ismini; daha sonra ekleyeceğiniz elemanları yazmalısınız. Bunu yaparkeen değişken ismine yine ekleme yapacağınız Array'in ismini vermeniz ve := yerine sadece = kullanmanız gerekir.
:= şeklindeki bir kullanım, değeri değişkene direkt olarak atar. Fakat sadece = kullanırsanız burada, geçici bir atama yaptığınızı düşünebilirsiniz. Yani biz bu ekleme işlemini yaparken aslında asıl Array'i değiştirmiyoruz. Ona, geçici bir eleman eklemiş oluyoruz. Eğer kalıcı bir değer ekleyecekseniz bunu, direkt olarak Array içerisine tanımlamanız gerekir.
Peki, bunu nerede kullanabiliriz? Scope kavramını hatırlayın; örneğin bir if bloğunda yazılan kodlar sadece o if bloğunu ilgilendiriyor, dışarıdan erişim olmuyordu. İşte, bir koşula bağlı olarak Array'in geçici olarak değişmesini istiyorsanız bunu kullanabilirsiniz.
Daha sonra yeşil kutudaki gibi Array'i tekrar yazdırıyoruz ve çıktıya baktığımızda Array'in güncel versiyonu ile karşılaşıyoruz.
Peki, iki Array'i birbirine nasıl ekleriz? Hatırlayın; farklı veri tiplerinde işlem yapmak oldukça zordu. Array'leri birbirine eklerken veri tipleri aynı olmak zorundadır. Fakat biz, iki string Array'i birleştireceğiz. Örneğin iller ve iller2 diye iki tane Array'imiz olsun. Bunları birleştirelim.

Muhtemelen aklınıza gelen ilk yöntem olan 'iller = append(iller, iller2)' şeklinde yapamıyoruz. Bunun yerine 'iller = append(iller, iller2...)' şeklinde bir kullanımımız vardır.
Yayınlanma Tarihi: 2022-08-12 22:36:57
Son Düzenleme Tarihi: 2022-08-15 14:24:49