1. Değişkenler ve Sabitler

Golang'da, değişkenler ve sabitler, bir programda çok önemli bir rol oynayan iki temel kavramdır.

  • Değişken, bir programa veri depolamak için kullanılan adlandırılmış bir tanımlayıcıdır. Golang'da, değişkenleri bildirmek için var anahtar kelimesi kullanılır.
  • Sabit, değeri program içinde değiştirilemeyen bir tanımlayıcıdır. Golang'da, sabitleri bildirmek için const anahtar kelimesi kullanılır.

2. Golang Değişkenlerin Bildirimi ve Başlatılması

2.1 Tek Bir Değişkenin Bildirimi ve Atanması

Go dilinde, var anahtar kelimesi, var değişken_adı tip formatıyla bir değişken bildirmek için kullanılır. Bildirildikten sonra, değişkene sonraki kodda bir değer atanabilir veya direk olarak bildirim anında başlatılabilir. Örneğin:

var age int // Bir tamsayı değişkeni olan age bildir
age = 25    // Değişkene bir değer ata

var name string = "Alice" // Değişken name'i bildir ve başlat

2.2 Birden Fazla Değişkenin Bildirimi

Go dili, birden fazla değişkenin aynı anda bildirilmesini destekler, bu da kodu daha anlaşılır kılabilir. Toplu bildirim genellikle bir fonksiyonun başında veya paket seviyesinde yapılır. Örneğin:

var (
    firstName, lastName string
    age                 int
)

firstName = "John"
lastName = "Doe"
age = 30

Yukarıdaki toplu bildirimde, firstName ve lastName string olarak, age ise tamsayı olarak bildirilmiştir.

2.3 Tür Çıkarımı ve Kısa Değişken Bildirimi

Go dilinde, değişkenin tipini her zaman açıkça belirtmek gerekli değildir. Bir değişken bildirilirken başlangıç ifadesi verilirse, Go değişkenin tipini çıkarabilir. Buna tür çıkarımı denir. := kullanarak kısa değişken bildirimi, tür çıkarımına dayalı olarak değişkenlerin bildirilmesini ve başlatılmasını basitleştirebilir. Örneğin:

city := "Pekin" // Şehri aynı anda bildir ve başlat
country := "Çin" // country bir string tipi olarak çıkarılır

Kısa değişken bildirimlerinin sadece fonksiyonlar içinde kullanılabileceğini ve global kapsamda kullanılamayacağını belirtmek önemlidir.

2.4 Fonksiyonlar Dışında Değişken Bildirimi

Fonksiyonların dışında bildirilen değişkenler, paket seviyesinde kapsama sahiptir. Bu değişkenler, tüm paket boyunca görünür ve erişilebilirdir. Örneğin:

var globalVar string = "Ben globalim" // global bir değişkenin bildirimi

func printGlobalVar() {
    fmt.Println(globalVar) // Fonksiyon içinde global değişkene erişme
}

Global değişkenler, paket içindeki herhangi bir fonksiyon arasında paylaşılabilir, ancak potansiyel isim çakışmaları ve belirsiz referansları önlemek için dikkatlice kullanılmalıdır.

İpucu: Buradaki temel fonksiyon kodlarını anlamak yeterli, fonksiyonların detaylı açıklamaları daha sonraki bölümlerde verilecektir.

3 Temel Veri Tipleri ve Sıfır Değerleri

3.1 Golang'da Temel Veri Tipleri

Go dilinde, her bir değişken türü, açık semantiğe ve davranışsal özelliklere sahiptir. İşte bazı temel veri tipleri:

  • int, int8, int16, int32, int64: Farklı tamsayı aralıkları
  • uint, uint8, uint16, uint32, uint64: İşaretsiz tamsayılar
  • float32, float64: Ondalık sayılar
  • bool: Boolean değerler (true veya false)
  • string: Dizgiler

3.2 Sıfır Değer Kavramı

Go dilinde, değişkenler, bildirimden sonra türün sıfır değerine otomatik olarak başlatılır. Sıfır değeri, bir değişken açıkça başlatılmadığında, ilgili türün varsayılan değeridir. Bu bazı diğer dillerde alışılmadık olabilir, ancak Go'da, bu durum tüm değişkenlerin her zaman geçerli bir başlangıç değerine sahip olmasını sağlar. İşte her bir temel veri tipinin sıfır değerleri:

  • Bir tamsayı için sıfır değer 0'dır
  • Bir ondalık sayı için sıfır değer 0.0'dır
  • Bir boolean için sıfır değer false'dur
  • Bir dizgi için sıfır değer boş bir dizedir ""

Örneğin:

var i int     // Sıfır değeri 0'dır
var f float64 // Sıfır değeri 0.0'dır
var b bool    // Sıfır değeri false'dır
var s string  // Sıfır değeri ""

Sıfır değer kavramını anlamak çok önemlidir, çünkü bu, değişken başlatma davranışını anlamaya ve null pointer veya başlatılmamış hataları önlemek için kullanılabilir.

4. Değişkenlerin Kapsamı

4.1 Yerel Değişkenler

Yerel değişkenler, bir fonksiyon içinde tanımlanan ve sadece o fonksiyon içinde erişilebilen değişkenlerdir. Fonksiyon parametreleri de yerel değişkenlere dahildir. Oluşturuldukları anda, fonksiyonun yürütülmesi tamamlandığında kadar yerel değişkenler ortadan kaybolur. Bir fonksiyon çağrıldığında, yerel değişkenler yeniden oluşturulur.

func yerelDegiskenOrnegi() {
    var yerelDegisken int = 10 // Bu bir yerel değişkendir
    fmt.Println(yerelDegisken)
}

func main() {
    yerelDegiskenOrnegi() // Çıktı: 10
    // fmt.Println(yerelDegisken) // Bu, yerelDegisken'in burada görünür olmamasına neden olur ve derleme hatasına yol açar
}

Yukarıdaki örnekte, yerelDegisken yalnızca yerelDegiskenOrnegi fonksiyonu içinde erişilebilir.

4.2 Global Değişkenler

Global değişkenler fonksiyonların dışında tanımlanan ve aynı paket içindeki herhangi bir dosyada erişilebilen değişkenlerdir. Global değişkenleri diğer paketlerde kullanmak istiyorsanız, değişken adının Go'nun erişim kontrol kurallarına uygun olarak büyük harfle başlaması gerekir.

package main

import "fmt"

var globalDegisken int = 20 // Bu bir global değişkendir

func main() {
    fmt.Println(globalDegisken) // Çıktı: 20
    globaliDegistir()
    fmt.Println(globalDegisken) // Çıktı: 30
}

func globaliDegistir() {
    globalDegisken = 30 // Global değişkenin değerini değiştir
}

Bu örnekte, globalDegisken hem main fonksiyonunda hem de globaliDegistir fonksiyonunda görünürdür.

5 Sabitlerin Tanımlanması ve Kullanımı

5.1 const Anahtar Kelimesi

Sabitleri tanımlamak için const anahtar kelimesini kullanırız. Sabitler, bir kez tanımlandıktan sonra değerleri değiştirilemeyen ve değiştirilemez. Sabitler, tamsayı, kayan noktalı sayılar, mantıksal değerler veya dizeler gibi temel veri tiplerinden herhangi biri olabilir.

const Pi = 3.14 // Bir float sabiti tanımla
const StrSabit string = "Merhaba, Dünya!" // Bir dize sabiti tanımla

func main() {
    fmt.Println(Pi)
    fmt.Println(StrSabit)
}

5.2 Enum Sabitleri

Go dilinin belirli bir sıralama tipi olmasa da, sıralamayı sağlamak için iota anahtar kelimesini kullanabilirsiniz. Bir const bloğu içinde, her ek sabit bildirimi, iota değerini 1 artırır.

const (
    Pazar = iota  // 0
    Pazartesi         // 1
    Salı        // 2
    Çarşamba      // 3
    Perşembe       // 4
    Cuma         // 5
    Cumartesi       // 6
)

func main() {
    fmt.Println(Pazar)    // Çıktı: 0
    fmt.Println(Cumartesi)  // Çıktı: 6
}

Yukarıdaki kod, haftanın günleri için bir sıralama bildirir. iota, const bloğu içinde 0 olarak başlar ve her sonraki bildirimde 1 artar.

5.3 Sabitlerin Kapsamı

Sabitlerin kapsamı değişkenlerle benzerdir. Bir sabit bir fonksiyon içinde tanımlanmışsa, kapsamı o fonksiyonla sınırlıdır. Bir sabit bir fonksiyon dışında (global olarak) tanımlanmışsa, kapsamı tüm pakettir ve ilk harfi büyükse diğer paketlerde erişilebilir.

Sabitlerin kapsamını yönetmek, global kapsam kirliliğini azaltmaya ve programın bakımını ve okunabilirliğini artırmaya yardımcı olur.

const GlobalSabit = "Bu bir global sabittir"

func main() {
    const YerelSabit = "Bu bir yerel sabittir"
    fmt.Println(GlobalSabit)  // Bu geçerlidir
    fmt.Println(YerelSabit)   // Bu geçerlidir
}

func baskaBirFonksiyon() {
    // fmt.Println(YerelSabit) // Bu, derleme hatası: YerelSabit bu fonksiyonda görünür değildir
    fmt.Println(GlobalSabit)  // Bu geçerlidir
}

Bu örnekte, YerelSabit yalnızca main fonksiyonu içinde erişilebilirken, GlobalSabit tüm paket boyunca erişilebilir.