Teknik Detaylar

Go Veri Tipleri - String, Integer, Float, Complex, Boolean ve Array

← Teknik Detaylar
2021-10-10 ~ 2022-05-11 · 4 dk okuma
Go Veri Tipleri - String, Integer, Float, Complex, Boolean ve Array
Bu yazıyı yapay zekâ ile tartış
Sayfayı kopyala

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ı" :)

Go, statically & strongly typed (statik ve katı tipli) bir dildir. Bu, her değişkenin derleme zamanında (compile-time) tipinin net olması gerektiği ve derleyicinin tip güvenliğini çok sıkı kontrol ettiği anlamına gelir.

💡 Özet (TL;DR):

  • Sıfır Değerler (Zero Values): Go'da tanımlanan her değişken varsayılan bir başlangıç değerine (0, "", false vb.) sahiptir. Tanımlanmamış veya boş (nil-pointer) hatalarının önüne geçilir.
  • Katı Tip Güvenliği: Go'da örtük (implicit) tip dönüşümü yoktur. int32 ile int64 bile doğrudan toplanamaz, açıkça dönüştürülmelidir.
  • Temel Yapılar: Nümerik tipler, string, bool ve boyutları sabit olan array.

Zero Value (Sıfır Değer) Kavramı

Go'da bir değişkeni tanımlayıp ona bir başlangıç değeri vermediğinizde, derleyici ona otomatik olarak o tipin zero value (sıfır değer) değerini atar. Bu, bellekte rastgele verilerin kalmasını ve çökme (crash) hatalarını engelleyen harika bir özelliktir.

var a int     // Varsayılan değeri: 0
var b string  // Varsayılan değeri: "" (boş string)
var c bool    // Varsayılan değeri: false
var d [3]int  // Varsayılan değeri: [0, 0, 0]

Explicit Type Conversion (Açık Tip Dönüşümü)

Go, PHP veya JavaScript gibi arka planda otomatik tip dönüştürmesi (implicit type casting) yapmaz. Kodun okunabilir ve hatasız olması için her dönüşümün açıkça belirtilmesi gerekir:

package main

import "fmt"

func main() {
    var sayi32 int32 = 10
    var sayi64 int64 = 20

    // Hatalı kullanım: sayi32 + sayi64 (Derleyici hata verir!)
    // Doğru kullanım:
    toplam := int64(sayi32) + sayi64
    fmt.Println(toplam)
}

String

Go'da string tanımlamak için string anahtar kelimesi kullanılır. Çift tırnak (") veya backtick (`) işaretleri içinde tanımlanırlar. Tek tırnak (') ise karakterleri (rune) tanımlamak için kullanılır.

Kaçış karakterleri (escape sequences):

  • \n yeni satır (new line)
  • \t sekme (tab)
  • \" çift tırnak (double quote)
  • \\ ters eğik çizgi (backslash)

Integer (Tam Sayılar)

Go, işaretli (signed - eksi değer alabilen) ve işaretsiz (unsigned - sadece artı değer alabilen) integer tiplerini destekler.

  • Signed (İşaretli): int8, int16, int32, int64
  • Unsigned (İşaretsiz): uint8, uint16, uint32, uint64
  • Mimariler: int ve uint tipleri de kullanılabilir. Bunların boyutları (32-bit veya 64-bit) uygulamanın üzerinde çalıştığı işletim sistemi mimarisine göre otomatik belirlenir.
var sayi8 int8 = 127
var sayi16 int16 = 32767
var sayi32 int32 = 2147483647
var sayi64 int64 = 9223372036854775807

Floating-Point (Ondalık Sayılar)

Go'da float32 (6 basamağa kadar kesinlik) ve float64 (15 basamağa kadar kesinlik) tipleri desteklenir.

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)
}

Çıktı:

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 & Boolean

  • Complex: Karmaşık matematiksel hesaplamalar için complex64 ve complex128 tipleri sunulur.
  • Boolean: Mantıksal ifadeler için bool (true veya false) kullanılır. Diğer dillerin aksine bool değerleri 0 veya 1 sayısal değerlerine örtük olarak dönüştürülemez.

Array (Diziler)

Array, boyutu en baştan belirlenen sabit bir veri grubudur. Array boyutu o veri tipinin bir parçasıdır. Bu yüzden [3]int ile [5]int Go derleyicisi için tamamen farklı iki veri tipidir.

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

Uzunluğu Belirsiz Diziler (Ellipsis)

Dizi boyutunu açıkça belirtmek yerine üç nokta (...) kullanarak Go'nun eleman sayısına göre boyutu otomatik atamasını sağlayabilirsiniz:

numbers := [...]int{1, 2, 3} // Dizi boyutu otomatik olarak 3 belirlenir.

Array vs Slice Karşılaştırması

ÖzellikArray (Dizi)Slice (Dilim)
Boyut YapısıSabittir (Static), sonradan değiştirilemez.Dinamiktir (Dynamic), boyutu büyüyebilir.
Veri TipiBoyut veri tipine dahildir ([3]int).Boyut veri tipine dahil değildir ([]int).
Bellek YönetimiDeğer tipidir (Value type). Kopyalanarak aktarılır.Referans yapısındadır. Pointer barındırır.
KullanımNadiren, boyutun kesinleştiği durumlarda.Go'da neredeyse her zaman listeler için.

Sıkça Sorulan Sorular (FAQ)

Go'daki rune ve byte nedir?

  • byte: Aslında uint8 tipinin bir takma adıdır (alias). 8-bitlik ham ASCII veya byte verilerini ifade etmek için kullanılır.
  • rune: Aslında int32 tipinin bir takma adıdır (alias). UTF-8 formatındaki tek bir Unicode karakterini (code point) temsil eder. JavaScript veya C#'tan farklı olarak Go'da char veri tipi yoktur, onun yerine rune kullanılır.

Neden Go'da örtük (implicit) tip dönüşümü yasaktır?

Bu tamamen dilin performansı ve güvenirliği ile ilgili bir tasarım kararıdır. Geliştiricinin farkında olmadan veri hassasiyeti (kesinlik) kaybetmesini (örneğin float64 bir değerin sessizce int32'ye yuvarlanmasını veya taşmasını) engeller.


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