GO Dilinde Veri Tipleri

GO programlama dilinde standart veri tipleri varsayılan olarak mevcuttur. Ayrıca kullanıcılar tarafından da veri tipi tanımlaması yapılabilmektedir. Bir değişken tanımlanırken herhangi bir veri tipi belirtilmezse GO en uygun veri tipini otomatik olarak atar.

Basit Veri Tipleri

Değiken AdıDeğişken AçıklamasıÖrnek İfade
floatOndalıklı Sayı ifadelerivar x float64 = 13.21
intTam Sayı ifadelerivar y int = 5
boolMantıksal Sınama ifadelerivar existence bool = true
stringMetin ifadelerivar selamlama string = "Merhaba dünya!"
runeKarakter ifadeleriItem3.2
byteByte Cinsinden ifadelerItem3.2

Karmaşık Veri Tipleri

Değiken AdıDeğişken AçıklamasıÖrnek İfade
arrayDizi ifadelerivar myarr = [3]int{3,12,21}
sliceDizi kesiti ifadelerivar myslice := myarr[0:2]
mapHashmap ifadelerivar city = [string]int{"Edirne":22, "Kırklareli":39,"Tekirdağ":59 }
structStruct ifadelerivar person = Person{"Gokay","BURUC",1987}
interfaceInterface ifadelerItem3.2

Veri Tiplerinin Belirtilmesi

Veri tiplerinin tanımlanması, işleme girecek öğelerin hafızada hangi tipte tutulacaklarına, hangi noktada saklanacaklarına ve ne kadar hafıza kaplayacaklarına dair bilgi vermektedir. Yani bilgisayara gönderilecek veriye ait ön bilginin yer aldığı bir irsaliye fişi vermek gibi düşünebiliriz. Birazdan sana float32 tipinde bir veri göndereceğim ve bu hafızanda 32 bitlik verilerde -3.4e+38 to 3.4e+38. sayı aralığında saklanacaktır. Bundan büyük değerler için float64 ifadesi kullanılabilir.

Veri TipiBit / Bayt Cinsinden KonumuDeğer Aralığı
int32bit sistem veya 64bit sisteme göre GO tarafından otomatik seçilir-2147483648 ile 2147483647 aralığında (32bit) -9223372036854775808 ile 9223372036854775807 aralığında(64bit)
int88bit / 1 bayt-128 ile 127 aralığında
int1616bit / 2 bayt-32768 ile 32767
int3232bit /4 bayt-2147483648 ile 2147483647
int6464bit / 8 bayt-9223372036854775808 ile 9223372036854775807

Yukarıdaki örnekte görüleceği üzere int cinsinden bir veri tanımlayıp değer ataması yapmazsak eğer 32bit bir sistem kullanıyorsak bu veri için 4bayt hafıza alanı ayrılacak ve bu veri -2147483648 ile 2147483647 aralığında olmak zorunda kalacaktır. Bu veri tipine daha büyük veya daha küçük bir değer atayamacağız. Bir ya da birkaç yüz tane veri ile çalışırken bu ufak hafıza değerleri çok büyük problemler yaratmayacaktır. Fakat milyonlarca verinin yer aldığı veri setleri ile çalışırken bu veri tiplerinin doğru tanımlanması hafıza ve performansı doğrudan etkileyecek öğeler haline gelecektir.

Veri Tiplerinin Çeşitleri

Tanımlanma yöntemine göre veri tipleri ikiye ayrılmaktadır:

Veri TipiAçıklama
Varsayılan Veri Tipleri (Default)Program kurulduğu an itibariyle tanımlı olan veri tipleridir.
Kullanıcı Tanımlı Veri Tipleri (User-Defined)Kullanıcı tarafından sisteme tanıtılan ve kullanılan veri tipleridir.

Veri Tiplerinin Gruplanması

Genel olarak veri tipleri dört ana başlık altında toplanabilir. Bu veri tipleri aşağıdaki gibidir.

  1. Basic type (Temel Veri Tipi ) : Sayılar, metin ve bool (mantıksal evet hayır ifadeleri) ifadeler bu kategoriye girer. int, float, string, bool, complex
  2. Aggregate type (Toplanmış Veri Tipi): Dizi ve yapılar bu kategoriye girer. array, struct
  3. Reference type (Referans Veri Tipi): İşaretçiler, dilimler, haritalar, işlevler ve kanallar bu kategoriye girer. pointer, slice, map, function, channel
  4. Interface Type (Arayüz Veri Tipi) : Arayüzler bu veri tipinde yer alır. interface

Veri TipiAçıklamaVeri Tipi İsimleri
Temel Veri TipiSayılar,ondalıklı ifadeler, kompleks sayılar, metinler ve mantıksal ifadelerint, float, string,bool,complex
Toplanmış Veri TipleriDiziler ve yapı ifadeleri bu kategoriye girerarray,struct
Referans Veri Tipleriİşaretçiler, dilimler, haritalar, işlevler, kanallar bu veri tipine girerpointer,slice,map,function,channel
Arayüz veri TipiArayüz ifadeleri bu veri tipine girerinterface

1. Temel Veri Tipleri (Basic Types)

Temel veri tipleri, programlama dillerinde olmazsa olmaz veri tipleridir. Dört işlem, metin işlemleri, mantıksal sınamalar ve diğer işlemleri yapmak için mutlak gerekli veri tipleridir.

  1. String (string)
  2. Int (int8, int16, int32, int64)
  3. Float ( float32, float64)
  4. Boolean (bool)
  5. Complex(complex)

Int (Integer-Tamsayı)

Tam sayı değerlerlerinin program hafızasında tutulduğu veri tipidir.

int tanımlaması aşağıdaki şekilde yapılır.

var degiskenAdi int = 32

İkinci bir tanımlama yöntemi ise şu şekildedir.

degiskenAdi := 35

Tamsayı veri tipleri ile bir dört islem uygulaması:

package main
import ("fmt")

func main(){

 var matematikNotu int8 = 85
 var edebiyatNotu int8 = 92
 fizikNotu = 65

 fmt.Println(matematikNotu, edebiyatNotu, fizikNotu)
 // ortalama
 fmt.Println((matematikNotu + edebiyatNotu + fizikNotu)/3)
}

Yukarıda tanımlandığı gibi sisteme int ifadesi ile bir değişken tanımladığımızda bu değişken sistem hafızasında integer olarak tutulur ve bu şekilde işlemlere dahil edilir.

Yukarıdaki örnek incelendiğinde matematikNotu isimli bir int ifadesi tanımladık. Bu değerler 1 ile 100 arasında olacağından dolayı veri tipi olarak int8 seçtik. Bu seçim sayılarımızın -127 ve 128 arasında olacağından dolayıdır. Aynı şekilde edebiyatNotu isimli bir int8 ifade tanımladık.

Int Veri Tipinin Hafızada Kapladığı Yer

Tanımladığımız verilerilerin hafızada kapladığı yer, programcıların en çok kafasını kurcalayan sorulardan biridir. Yazdığınız programın performansını etkiler.

Hafızada kapladığı yere göre int veri tipleri aşağıda yer almaktadır.

Veri TipiAçıklamaVeri Aralığı
int88-bit signed integer-127 ve 128 değerleri arasında yer alır ( signed integer)
int1616-bit signed integer-32,768 ve +32,767 değerleri arasında yer alır
int3232-bit signed integer-2147483648 to 2147483647 değerleri arasında yer alır
int6464-bit signed integer-9,223,372,036,854,775,808 ve 9,223,372,036,854,775,807 değerleri arasında yer alır.
uint88-bit unsigned integer0 ve 255 değerleri arasında yer alır
uint1616-bit unsigned integer0 ve 65535 değerleri arasında yer alır
uint3232-bit unsigned integer0 ve 4294967295 değerleri arasında yer alır
uint6464-bit unsigned integer0 ve (2^64) değerleri arasında yer alır
intHem int hem de uint, 32 veya 64 bit olmak üzere aynı boyutu içerir.
uintHem int hem de uint, 32 veya 64 bit olmak üzere aynı boyutu içerir.
runeİnt32 ile eşanlamlıdır ve ayrıca Unicode kod noktalarını temsil eder.
byteuint8 ile eşanlamlıdır.
uintptrİşaretsiz bir tamsayı (unsigned integer) türüdür. Genişliği tanımlanmamıştır, ancak bir işaretçi değerinin tüm bitlerini tutabilir.

32 bit , 64 bit veri tiplerinin mevcut olmasının temel sebebi tutulacak verinin sistemde kaplayacağı yeri düzenlemek içindir.

Birden çok veri tipinin olması sistem hafızasında kaplanacak yer sorunu ile ilgilidir.Milyonlarca sayıdan oluşan bir veri setinin olduğunu düşünelim. Bu sayıların ise 1 ile 1000 arasında yer aldığını düşünelim. Eğer sisteme int16 ( 16 bit tamsayı ) veri tipinde veri girileceğini belirtmez isek sistem bu veri tipleri için int64 (64 bit tamsayı ) imiş gibi muamele edip her bir sayı için 2^64 'lük bir yer ayıracaktır. Böylece yapılan işlemler için ayrılan hafıza muazzam boyutlarda artacaktır.

uint veri tipi yalnızca pozitif değerleri alabilen int veri tiplerini tanımlar. Bir veri tipinin başına u ifadesi geldiğinde bu unsigned anlamış taşır ve veri tipinde negatif değerler alınamayacağını belirtir.

Float (Ondalık)

Virgül ya da nokta ile ayrılmış ondalıklı değerleri ifade eder. int ifadelerinde olduğu gibi float ifadelerde de hafızada kapladığı yere bakılarak bir seçim yapılır.

var sicaklik float32 = 33.25

Diğer bir tanımlama ise şu şekilde yapılabilir.

sicaklik := 33.25

Veri tipi tanımlaması aşağıdaki tabloya göre belirlenir.

Veri TipiAçıklamaDeğer Aralığı
float3232-bit IEEE 754 floating-point numberİşaretli bir 32 bit tamsayı değişkeni maksimum 231 − 1 = 2,147,483,647 değerine sahipken, bir IEEE 754 32 bitlik taban-2 kayan noktalı değişkenin maksimum değeri (2 − 2−23) × 2127 ≈ 3.4028235 × 1038 .
float6464-bit IEEE 754 floating-point number

float ifadelerle dört işlem ile ilgili bir kod uygulaması aşağıda yer almaktadır.

package main

import "fmt"

func main() {

 //float verilerin tanımlanması
 a := 20.45
 b := 34.89

 //Cikartma islemi
 c := b - a

 // Sonuc Görüntülemesi
 fmt.Printf("Result is: %f", c)

 // Vier türünün görüntülenmesi
 fmt.Printf("\nThe type of c is : %T", c)
}

Örneğimizde a ve b olmak üzere iki adet float değişken tanımlanmıştır. İki değere de float64 atanmıştır.

HATIRLATMA: Eğer float ifade tanımlanırken 32bit,64bit vs. seçilmeden tanımlama yapılırsa GO otomatik olarak float64 seçimi yapar.


String (Metin)

String veri türü metin verilerinin bir dize olarak tutulduğu veri tipidir. Bu veriler baytlardan oluşur.

string ifadeler aşağıdaki şekilde tanımlanır.

var degiskenAdi string = "metin ifadesi"

ikinci bir tanımlama yöntemi ise aşağıdaki şekildedir.

degiskenAdi := "metin ifadesi"

Şimdi bir uygulama örneği ile devam edelim.

package main

import "fmt"

func main() {
 stringIfadesi := "GOKAYBURUC.DEV"

 // String ifadesinin uzunluğunun görüntülenmesi
 fmt.Printf("String ifadesinin uzunlugu:%d", len(stringIfadesi))

 // String ifadesinin görüntülenmesi
 fmt.Printf("String ifadesi: %s", stringIfadesi)

 // String ifadesinin veri türünün görüntülenmesi
 fmt.Printf("String ifadesinin tipi: %T", stringIfadesi)
}

Boolean (Mantıksal)

Bir veri tipinin mantıksal değerler olan true ya da false döndürdüğü ifadelerdir. Bir koşullu işlemin sonucu bilgisayar tarafından geçerli olduğu noktada true geçersiz olduğu noktada ise false değerini döndürür.

Veri TipiAçıklama
truekoşul sınamasının olumlu olması sonucu dönen değer
falsekoşul sınamasının olumsuz olması sonucu dönen değer

Atama yöntemi :

var ehliyetMevcut = true

veya

ehliyetMevcut := false

şeklindedir.

Boolean Uygulaması

true ve false degerleri atanmış degiskenlere ait örnek aşağıda yer almaktadır.

package main
import "fmt"

func main(){

 var a = 25
 var b = 45

 a=25
 b=45

 //mantıksal sorgu  operatörleri
 sorguBir := (a > b) // a büyüktür b
 sorguİki := (a < b) // a kücüktür b
 sorguUc := (a == b) // a eşittir b
 sorguDort := (a != b) // a eşit değildir b

 fmt.Println(sorguBir)
 fmt.Println(sorguİki)
 fmt.Println(sorguUc)
 fmt.Println(sorguDort)


 // Deger ataması
 var ehliyet bool = true
 var ruhsat bool = false

 fmt.Printf("Ehliyet : %v\nRuhsat : %v \n", ehliyet,ruhsat)
}

Yukarıdaki örneğimizde mantıksal sorgu operatörleri kullanılmıştır.

Bu operatörler:

  • Eşitlik ( == )
  • Eşit Olmama (!=)
  • Büyüklük ( > )
  • Küçüklük ( < )
  • Büyük ve Eşitlik ( >= )
  • Küçük ve Eşitlik ( <= )

olarak sıralanabilir.

Bu sorguların sonuçları true ve false olarak döndürülür.

Bizim örneğimizde :

 //mantıksal sorgu  operatörleri
 sorguBir := (a > b) // a büyüktür b
 sorguİki := (a < b) // a kücüktür b
 sorguUc := (a == b) // a eşittir b
 sorguDort := (a != b) // a eşit değildir b

mantıksal sorguları mevcuttur ve bu sorgular önermenin doğruluğuna bağlı olarak true ve false olarak değer döndüreceklerdir. Misal örneğimizde a sayısı 25 ve b sayısı 45 olduğu için a < b önermesi true ve a > b önermesi false döndürecektir.

Complex ( Karmaşık )

Matematik gösterimi i ve j ye bağlı olan ve iki boyutlu bir analitik düzlem üstünde gösterilen sayılar için sistem hafızasında tutulan veri tipidir.

Komplek Sayi j + Xi seklinde yazılır. Yani sayının bir imajiner bir de reel kısmı mevcuttur. Sonuçlarımız da bu şekilde döndürülecektir.

Yazım şekili

var degiskenAdi complex64 = complex(2,15)

ikinci yazım şekli

var degiskenAdi := complex(2,15)

Komplex sayı veri tipine ait tablo aşağıda yer almaktadır.

Veri TipiAçıklama
complex64float32 değerini reel (j) ve imajiner (i) kısımda tutan deger
complex128float64 değerini reel (j) ve imajiner(i) kısımda tutan değer

Aşağıda açıklama örneğimiz yer almaktadır.

// Go program to illustrate
// the use of complex numbers
package main

import "fmt"

func main() {

   var a complex128 = complex(6, 2)
   var b complex64 = complex(9, 2)

 // ilk cıktılar
   fmt.Println(a)
   fmt.Println(b)

   // Display the type
  fmt.Printf("The type of a is %T and "+
            "the type of b is %T ", a, b)
}

Örneğimizde a ve b olarak iki adet kompleks sayı tanımladık.

  // kompleks sayı tanımlamaları
   var a complex128 = complex(6, 2)
   var b complex64 = complex(9, 2)

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

(6+2i)
(9+2i)
The type of a is complex128 and the type of b is complex64%

Kaynakça

  1. https://www.geeksforgeeks.org/data-types-in-go/
  2. https://go.dev/tour/basics/11
  3. https://www.programiz.com/golang/data-types