Kapak fotoğrafı Mikael Blomkvist

Go’da değişkenler konulu yazımda, “Go’da Veri Tiplerine sonraki yazıda değineceğim” demiştim. İşte bu yazı o “sonraki yazı” 🙂

Bu yazıda Golang’da kullandığımız temel ve ileri düzey veri tiplerinden bahsedeceğim. Kodlama içinde de orijinal isimlerini kullanacağınız için burada da Türkçeleştirmeden orijinal isimlerini kullanacağım;

  • Nümerik tipler,
  • Array
  • Slice ( ve neden Array yerine tercih edilmeli )
  • Map ( ne zaman map, ne zaman slice kullanılmalı )
  • Struct
  • Pointer
  • Constant ( Go’da değişkenler yazısının sonunda değinmiştim )

String

Go’da string tipini tanımlamak için string anahtar kelimesini kullanıyoruz. Diğer bazı programlama dillerinden farklı olarak go’da stringleri tırnak işareti ( ” ) içerisinde tanımlıyoruz. Tek tırnak ( ‘ ) ise karakterleri tanımlamak için kullanılıyor. String içerisinde kaçış (escape) karakteri tanımlama da bir çok dille benzer şekilde yapılıyor. Bir sting içerisinde kullanabileceğiniz kaçış karakterleri şunlar;

  • \n yeni satır ( new line )
  • \r satır başı ( carriage return )
  • \t sekme ( tab )
  • \’ tek tırnak (single quotation mark )
  • \” çift tırnak (double quotation mark )
  • \\ ters eğik çizgi ( back slash )

Integer

Go, işaretli (signed) ve işaretsiz (unsigned) 4 farklı büyüklükte integer tipi destekliyor. Bunlar int8, int16, int32 ve int64 (işaretliler) ve uint8, uint16, uint32 ve uint64 (işaretsiz). Tiplerin sonundaki rakamlar bit sayısını ifade ediyor. (8 bit integer, 16bit integer vs. gibi)

Bu tiplere ek olarak int ve uint tiplerini de kullanabilirsiniz. Bunlar mimariniz ve alt yapınıza göre otomatik olarak int32 ya da int64 değerlerini alacaktır.

İşaretli (signed) ve işaretsiz (unsigned) integer değer neyi ifare eder? Unsigned integer’larda bitlerin tamamını sayıyı ifade etmek için kullanırsınız. 8 bitlik bir integer 2^8 = 256 farklı değeri ( 0 – 255 arası ) ifade edebilir. Fakat bu bitlerden birini sayını işaretini tutmak için harcarsak geriye kalan 7 bit 2^7= 128 farklı değeri ifade edebilir. 8. bit işaret için kullanılarak -127 ile +127 arasında sayılar ifade edilebilir. Benzer mantık int16, int32 ve int64 için de geçerlidir. Bir değişkenin değerinin eksi olmayacağından eminseniz uint tipini kullanabilirsiniz.

var sayi8 int8 = 127
var sayi16 int16 = 32767
var sayi32 int32 = 2147483647
var sayi64 int64 = 9223372036854775807

Floating-point

Go’da float32 ve float64 floating-point tipleri desteklenir. Float tipi ile yukarıdaki int tiplerinin yetersiz olduğu büyüklükleri ve daha da önemlisi ondalık basamakları ifade edebilirsiniz. Float32 6 ondalık basamağa kadar kesinlik sağlarken, Float64 15 basamağa kadar kesinlik sağlar.

package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Println("En büyük Int32   : ", math.MaxInt32)
	fmt.Println("En büyük Float32 : ", math.MaxFloat32)
	fmt.Println("En büyük Int64   : ", math.MaxInt64)
	fmt.Println("En büyük Float64 : ", math.MaxFloat64)
}

Yukarıdaki kodu çalıştırarak Int32, Float32, Int64 ve Float64 tipleri ile ifade edilebilecek en büyük sayıları görebiliriz. Sonuçları aşağıda paylaşıyorum

En büyük Int32   :  2147483647
En büyük Float32 :  3.4028234663852886e+38 
En büyük Int64   :  9223372036854775807    
En büyük Float64 :  1.7976931348623157e+308

Complex

Int ve Float kadar çok ihtiyacınız olmasa da Go complex64 ve complex128 adında iki karmaşık sayı tipini de sunuyor. İlki gerçek kısım için bir float32 kullanıp, kalanı sanal kısma ayırırken, ikincisi gerçek kısım için float64 kullanıyor.

Boolean

Boolean’lar programla dilinin vazgeçilmezleri. Go’da Boolean tanımlamak için bool anahtar kelimesini kullanıyoruz. Diğer bir çok dilden farklı olarak Go’da boolean değelerini 0 ya da 1’e eş değer düşünmemelisiniz.

Array ( Dizi )

Array, yani diziler yukarıda tanımadığımız değişken tipleri ve çok daha fazlasını ( özel tipler gibi ) bir seri halinde tutmak için kullanılan özel veri tipleri. PHP ya da Javascript’de değişkenin array olduğunu tanımlamanız yeterliyken, Go’da biraz daha detaya inmeniz ve array içerisinde saklanacak veri tipini ve array büyüklüğünü de en baştan belirlemeniz gerekiyor.

Go’da array tanımamak için tipik olarak şöyle bir ifade kullanıyoruz:

MyArray := [3]string{"Ayşe", "Fatma", "Hayriye"}

Bu ifade ile MyArray isimli değişkenimizin 3 elemanlı bir dizi olduğunu ve elemanların değerlerinin string tipinde olduğunu tanımlamış olduk. Elemanların değerlerini örnekteki gibi oluşturma anında atayabileceğiniz gibi, diziyi var MyArray [3]string şeklinde tanımlayarak değerlerini daha sonra da atayabilirdiniz.

Go’da da çoğu dilde olduğu gibi ( benim bildiğim tüm programala dillerinde öyle ), array’in index değeri 0’dan başlıyor. eğerleri sonradan atamak (veya o değerlere ulaşmak isterseniz ) indeksin 0’dan başladığını dikkate almalısınız. ( MyArray[0] = “Ayşe” , MyArray[1]= “Fatma” , My Array[2]= “Hayriye” gibi )

Çok Boyutlu Diziler

Yukarıdaki örnekte tanımladığımız dizi tek boyutlu bir diziydi. Fakat dizileri çok boyutlu olarak da oluşturabilirsiniz. Örneğin; var myArray [3][5]string şeklinde tanımladığınız array iki boyutlu bir array olur. Bunu iç içe diziler tanımlamak şeklinde düşünebilirsiniz. myArray değişkenimiz her biri 5’er tane string eleman tutan, 3 tane dizi tutuyor gibi düşünebiliriz.

Uzunluğu belirsiz diziler

Go bir dizi oluştururken, dizinin uzunluğunun başlangıç aşamasında belirli olmasını istiyor. ( Birazdan Slice tipi ile bunu nasıl aşabileceğimizi göreceğiz ) Fakat bu uzunluğu açık olarak belirtmeden sadece değerleri belirterek Go’nun bu uzunluğu otomatik olarak belirlemesini sağlayabilirsiniz. Bunun için üç nokta/ellipsis ( … ) kullanıyoruz.. Örneğin;

numbers := [...]int{1, 2, 3}
cities := [...]string{"İstanbul", "Ankara", "İzmir"}

Dizi boyutu yerine … koyduğumuzda, go verdiğimiz değerleri dikkate alarak dizi boyutunu 3 olarak ayarlayacaktır.

Bir sonraki yazıda Go’da Slice’lardan bahsedeceğiz.

Bu Yazıda Yapılan Değişiklikler
  • 11.05.2022: Yazı özeti düzenlendi.