Arrays - Diziler

Dizi Kavramı

Dizi birden çok elemanın bir arada olduğu elemanlar kümesi olarak ifade edilir.

GO programlama dilinde diziler, aynı veri türüne ait elemanlar kümesidir. Yani string veri türündeki ifadelerin bir araya gelmesinden oluşan bir küme dizi string türünde bir dizidir. Aynı şekilde int , float , bool ifadeleri de birer dizi oluşturabilir.

DİKKAT: GO programlama dili farklı veri tiplerinin bir arada olduğu dizilere izin vermez.

Dizilerin Tanımlanması

Dizi tanımlanması sırasında iki farklı metod vardır:

  1. Öğe sayısı belirterek dizi tanımlama
  2. Öğe Sayısı belirtmeden dizi tanımlama
// oge sayısı belirterek dizi tanımlama

var arr = [3]string{}

var arr=[3]string{} ifadesinde bu dizi maksimum 3 ogeden olusacaktır diye oge sayisi belirttik. Dorduncu bir deger girilmeye calisildiginda dizi hata dondurecektir.

// oge sayisi belirtmeden dizi tanımlama
var arr2 = [...]int{111,209,301,498}

var arr2 = [...]int{111,209,301,498} ifadesinde ise girilecek oge miktarı önceden belirtilmemistir ve kullanıcıya bırakılmıştır. Ust limit yoktur.

Burada 3 elemanı olan ve string türünde veriler barındıracak bir dizi tanımladınız. Ama dizimizin henüz hiç elemanı yok.

Dizilerin Elemanları ve Dizi Indeksleri

Üç elemandan oluşan bir dizi tanımlayalım ve içine değerlerimizi atayalım.


func main(){

	var firstArray = [4]string{"Edirne", "Kırklareli", "Tekirdağ", "Çanakkale"}

	// array
	fmt.Println(firstArray)

	// zero indexed item
	fmt.Println(firstArray[0])

	// second indexed item
	fmt.Println(firstArray[2])
	fmt.Printf("Second indexed item in array:%s\n", firstArray[2])

}

Kod satırı çalıştırıldığında şöyle bir çıktı elde edeceksiniz:

[Edirne Kırklareli Tekirdağ Çanakkale]
Edirne
Tekirdağ
Second indexed item in array:Tekirdağ

Dizinin kendisi, sıfır index numaralı değeri, 2 index numaralı değeri ekranda görüntülenir.

HATIRLATMA: Programlama dillerinde, dizi elemanları sıfırdan başlayarak index değeri alırlar. Yani a dizisinin ilk değeri a[0] değeridir.

Dizinin Öğelerini Değiştirmek

Dizi içinde bir değere yeni bir atama yapmak istediğimizde o değerin indeks numarasını belirterek doğrudan atama yapabiliriz. Dikkat etmemiz gereken en önemli konu dizi indeksinin 0 değeri ile başlamasıdır. Yani 4 elemanlı bir dizinin son elemanının dizi numarası indekslememiz 0 değerinden başladığı için 3 olacaktır.


package main

import "fmt"

func main() {

	sehirler := [...]string{
		"Kırklareli",
		"Edirne",
		"Çanakkale",
		"Bursa",
		"Tekirdağ",
		"İstanbul",
		"Kocaeli",
	}


  // dizinin boyutu
  fmt.Println(len(sehirler))

	sehirler[6] = "Paris"

	fmt.Printf("sehirler 6 indexed item is : %s\n", sehirler[6])


}

Kodu çalıştırdığımızda ekranda şu şekilde bir çıktı alacaksınız:

7
sehirler 6 indexed item is : Paris

Yedi elemandan oluşan bir listemiz var ve indeks numarası 6 olan öğe paris olarak değiştirildi.

Out of Bounds (Sınırlama Dışında Değer) Hatası

Peki 3 elemanla sınırlanmış bir diziye bir tane dördüncü eleman atarsak ne olur? Kodumuzda dizi değerlerini yazdığımız kısma aşağıdaki kodu ilave edip tekrar çalıştıralım.

dizi[3] = "Amasya"

Kodumuzun son hali:

package main
import (
  "fmt"
)

func main(){
  var dizi = [3]string{}

  dizi[0] = "Edirne"
  dizi[1] = "Bursa"
  dizi[2] = "Manisa"
  dizi[3] = "Amasya" // yeni eklediğimiz değer

  //dizinin goruntulenmesi
  fmt.Println(dizi)

  // dizinin birinci degeri
  fmt.Println(dizi[1])
}

Kodu çalıştırdığımızda aşağıdaki hatayı alacaksınız.

invalid argument: index 3 out of bounds [0:3]

out of bounds hatası dizinin sınırlandığı değer sayısından fazla öğe girildiğini belirtir.

Siz dize tanımlarken 3 değerden oluşan bir dize tanımlayacağınızı belirttiniz fakat şimdi dördüncü elemanı tanımlıyorsunuz. Ya bu kuralı belirtmeyin açık uçlu bir dize tanımlayın ya da sayıyı arttırın.

Dizilerde Varsayılan Değerler

Bir diziye ait değerlere atama yapılmadığında GO bu atanma yapılmayan değerler için varsayılanlar atar. Siz eğer bu değerleri unuttuysanız ya da bilerek vermediyseniz GO buraya uygun değer atamasını kendiliğinden sağlar.

Bu varsayılanlar :

  • int ve float değerler için varsayılan : 0
  • string ifadeler için varsayılan : null (boşluk karakteri)
  • bool ifadeler icin varsayilan : false

değerleridir.

package main


func main() {

	arr1 := [5]int{}              //not initialized
	arr2 := [5]int{1, 2}          //partially initialized
	arr3 := [5]int{1, 2, 3, 4, 5} //fully initialized

	fmt.Println(arr1)
	fmt.Println(arr2)
	fmt.Println(arr3)


	city1 := [3]string{}
	city2 := [3]string{"Bursa", "İstanbul"}
	city3 := [3]string{"Bursa", "İstanbul", "Edirne"}

	fmt.Println(city1)
	fmt.Println(city2)
	fmt.Println(city3)


	derece := [3]float64{0: 22.4, 2: 11.3}
	fmt.Println(derece)

	yoklama := [4]bool{true, false, 3: false}
	fmt.Println(yoklama)
}

Kodu çalıştırdığımızda ekran çıktımız aşağıdaki gibi olacaktır:

[0 0 0 0 0]
[1 2 0 0 0]
[1 2 3 4 5]
-----------------------------
[  ]
[Bursa İstanbul ]
[Bursa İstanbul Edirne]
-----------------------------
[22.4 0 11.3]
-----------------------------
[true false false false]

Burada yeni bir ifade görüyoruz o da derece := [3]float64{0: 22.4, 2: 11.3} ifadesindeki 0:22.4 yazımıdır. Bu yazım sıfır numaralı indekse 22.4 ifadesinin ata anlamına gelir.

Çok Boyutlu Diziler - MultiDimensional Arrays

Peki bizim diziler hep tek şekilde mi olacak hiç dizi değerleri içerisinde birden çok dizi olan matrisleri kullanamayacak mıyız? Bu soruya da yanıt verelim.

diziAdı := [dimension1][dimension2][dimension3][dimension...]string

Bir çok boyutlu dizi tanımlarken boyut miktarı kadar [] ifadesi ve sonrasında string, int,float, bool gibi veri tipleri bildirilerek tanımlama yapılır.

hayvanlar := [3][2]string{
  {"aslan", "kaplan"},
  {"kedi", "köpek"},
  {"güvercin", "kartal"}, // sondaki virgül gereklidir
}

3 satır ve 2 sütundan oluşan bir dize tanımladık. Dizimiz 2 boyutludur. Eğer başka bir köşeli parantez ve değer daha eklersek dizimiz 3 boyutlu bir dizi olacaktır.

DİKKAT: {"güvercin", "kartal"}, ifadesinde yer alan sondaki virgül , gereklidir.Alt alta satır yazarken en son satır virgül ile bitirilir. GO yazım kuralları gereğince dizi tanımlaması sırasında birden çok satır kullanılırsa virgül ile bitirilmelidir.

Şimdi dizimizi ekrana yazdıralım:

package main
import "fmt"

func main(){

  hayvanlar := [3][2]string{
    {"aslan", "kaplan"},
    {"kedi", "köpek"},
    {"güvercin", "kartal"}, // sondaki virgül gereklidir
  }
  // dizi
  fmt.Println(hayvanlar)

  // dizinin ikinci elemanının birinci degeri
  fmt.Println(hayvanlar[2][1])
}

Ekran çıktımız:

[[aslan kaplan] [kedi köpek] [güvercin kartal]]
kartal

şeklinde olacaktır.