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 |
|---|---|---|
float | Ondalıklı Sayı ifadeleri | var x float64 = 13.21 |
int | Tam Sayı ifadeleri | var y int = 5 |
bool | Mantıksal Sınama ifadeleri | var existence bool = true |
string | Metin ifadeleri | var selamlama string = "Merhaba dünya!" |
rune | Karakter ifadeleri | Item3.2 |
byte | Byte Cinsinden ifadeler | Item3.2 |
Karmaşık Veri Tipleri
| Değiken Adı | Değişken Açıklaması | Örnek İfade |
|---|---|---|
array | Dizi ifadeleri | var myarr = [3]int{3,12,21} |
slice | Dizi kesiti ifadeleri | var myslice := myarr[0:2] |
map | Hashmap ifadeleri | var city = [string]int{"Edirne":22, "Kırklareli":39,"Tekirdağ":59 } |
struct | Struct ifadeleri | var person = Person{"Gokay","BURUC",1987} |
interface | Interface ifadeler | Item3.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 Tipi | Bit / Bayt Cinsinden Konumu | Değer Aralığı |
|---|---|---|
int | 32bit sistem veya 64bit sisteme göre GO tarafından otomatik seçilir | -2147483648 ile 2147483647 aralığında (32bit) -9223372036854775808 ile 9223372036854775807 aralığında(64bit) |
int8 | 8bit / 1 bayt | -128 ile 127 aralığında |
int16 | 16bit / 2 bayt | -32768 ile 32767 |
int32 | 32bit /4 bayt | -2147483648 ile 2147483647 |
int64 | 64bit / 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 Tipi | Açı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.
- 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
- Aggregate type (Toplanmış Veri Tipi): Dizi ve yapılar bu kategoriye girer. array, struct
- Reference type (Referans Veri Tipi): İşaretçiler, dilimler, haritalar, işlevler ve kanallar bu kategoriye girer. pointer, slice, map, function, channel
- Interface Type (Arayüz Veri Tipi) : Arayüzler bu veri tipinde yer alır. interface
| Veri Tipi | Açıklama | Veri Tipi İsimleri |
|---|---|---|
| Temel Veri Tipi | Sayılar,ondalıklı ifadeler, kompleks sayılar, metinler ve mantıksal ifadeler | int, float, string,bool,complex |
| Toplanmış Veri Tipleri | Diziler ve yapı ifadeleri bu kategoriye girer | array,struct |
| Referans Veri Tipleri | İşaretçiler, dilimler, haritalar, işlevler, kanallar bu veri tipine girer | pointer,slice,map,function,channel |
| Arayüz veri Tipi | Arayüz ifadeleri bu veri tipine girer | interface |
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.
- String (string)
- Int (int8, int16, int32, int64)
- Float ( float32, float64)
- Boolean (bool)
- 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 Tipi | Açıklama | Veri Aralığı |
|---|---|---|
| int8 | 8-bit signed integer | -127 ve 128 değerleri arasında yer alır ( signed integer) |
| int16 | 16-bit signed integer | -32,768 ve +32,767 değerleri arasında yer alır |
| int32 | 32-bit signed integer | -2147483648 to 2147483647 değerleri arasında yer alır |
| int64 | 64-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. |
| uint8 | 8-bit unsigned integer | 0 ve 255 değerleri arasında yer alır |
| uint16 | 16-bit unsigned integer | 0 ve 65535 değerleri arasında yer alır |
| uint32 | 32-bit unsigned integer | 0 ve 4294967295 değerleri arasında yer alır |
| uint64 | 64-bit unsigned integer | 0 ve (2^64) değerleri arasında yer alır |
| int | Hem int hem de uint, 32 veya 64 bit olmak üzere aynı boyutu içerir. | |
| uint | Hem 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. | |
| byte | uint8 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.
uintveri tipi yalnızca pozitif değerleri alabilenintveri tiplerini tanımlar. Bir veri tipinin başınauifadesi 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 Tipi | Açıklama | Değer Aralığı |
|---|---|---|
| float32 | 32-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 . |
| float64 | 64-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 Tipi | Açıklama |
|---|---|
true | koşul sınamasının olumlu olması sonucu dönen değer |
false | koş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ı
truevefalseolarak 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 Tipi | Açıklama |
|---|---|
| complex64 | float32 değerini reel (j) ve imajiner (i) kısımda tutan deger |
| complex128 | float64 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%