# Go ve Değişkenler

> Go dilinde değişken tanımlama yöntemleri, kısa atama operatörleri, sabitler (constants) ve iota kullanımının temel esasları.

> 💡 **Özet (TL;DR):**
> - **Değişken Tanımlama:** Go'da değişkenler `var` anahtar kelimesiyle veya fonksiyon içinde `:=` (kısa atama) operatörüyle tanımlanır.
> - **Katı Kurallar:** Go'da tanımlanan her değişkenin mutlaka kullanılması gerekir (Kullanılmayan değişkenler derleme hatasına yol açar).
> - **Sabitler:** Değiştirilemeyen değerler için `const` anahtar kelimesi kullanılır. Ardışık sabit değerleri otomatik artırmak için `iota` tercih edilir.

Daha önce Go'dan kısaca bahsetmiş, Windows ve Linux'ta kurulumlarının nasıl yapılacağını anlatmıştım. İlgili yazıların bağlantıları için bkz. [Go Programlama Dilinin Özellikleri](/tr/go-programlama-dilinin-ozellikleri), [Windows 10'da Go Kurulumu](/tr/windows-10-golang-kurulumu), [Linux'ta Go Kurulumu](/tr/linuxda-golang-kurulumu).  
  
Go'ya giriş yaptığım bu ilk yazıda değişkenleri inceleyeceğim. Yazıda belirli seviyede bir programlama altyapınız olduğunu ve sadece Go'da yeni olduğunuzu varsayarak çok temel konulara değinmeyeceğim.

Go'da birçok veri tipi bulunsa da bu veri tiplerinde değişken tanımlamak için aynı yöntemi izliyoruz. Go'da değişkenlerle ilgili bilmeniz gereken **bir numaralı kural**: Bir değişkeni tanımladıysanız kullanın, kullanmayacaksanız tanımlamayın. Bilmeniz gereken **ikinci kural** ise [Go'da Garbage Collection (Çöp Toplayıcı)](/tr/garbage-collection-ve-golang) başlıklı yazının bir bölümünde değindiğim gibi değişkenleri tanımladığınız kapsamları (scope) doğru seçmenizdir. Değişken size nerede lazımsa orada tanımlayın; değişken tanımını gereksiz yere globalde veya daha üst kapsamlarda yapmayın.

Şimdi gelelim Go'da nasıl değişken ve sabit tanımladığımıza.

---

## Go'da Değişken Tanımlama Yöntemleri

Go'da değişken tanımlamak için birden fazla yöntem vardır. İlk ve en açık yöntem, başka dillerde de kullanılan `var` anahtar kelimesini tercih etmektir.

Aşağıdaki satırda `username` adında ve `string` tipinde bir değişken tanımlıyoruz:

```go
var username string
```

Aynı veri tipinde birden fazla değişkeni tek satırda tanımlayabiliriz. Örneğin aşağıda `username` ve `password` adında ve `string` tipinde iki değişken tanımlıyoruz. Değişken adları arasında virgül kullanmamız gerekir:

```go
var username, password string
```

Değişken tanımlarını parantez içerisine alarak, tek bir `var` anahtar kelimesi ile birden fazla değişken tanımlayabiliriz:

```go
var (
    username, password string
    loginCount int
)
```

---

## Go'da Değişkenlere Başlangıç Değeri Atama

Go bu konuda oldukça esnek bir yapı sunar ve değer atamak için birden fazla seçeneğiniz bulunur.

Değişken tanımını aşağıdaki şekilde yaparsanız Go hem bu değerleri başlangıç değeri olarak atayacak hem de bu değerlerin tipini otomatik olarak (type inference) tespit edecektir:

```go
var (
    username = "evrenbal"
    password = "şifre"
    loginCount = 0
)
```

İsterseniz bu işlemi tek satırda da gerçekleştirebilirsiniz:

```go
var username, password, loginCount = "evrenbal", "şifre", 0
```

Ancak Go'da değişken tanımlama ve ilk değerini atama için çoğu zaman yukarıdaki yöntemler yerine kısa yol kullanılır. Normal şartlarda `=` ile bir değer atamak isterseniz bu değişkenin önceden tanımlanmış olması gerekir. Fakat değer atamayı `:=` ile yaparsanız Go değişkeni oluşturur, veri tipini verdiğiniz değere göre otomatik belirler ve bu değeri değişkene atar:

```go
func main() {
    username, password := "John", "Doe"
    loginCount := 0
    fmt.Println(username, password, loginCount)
}
```

Bu yöntemde veri tipleri konusunda dikkatli olmalısınız. (İleriki yazılarda Go'da veri tiplerine detaylıca değineceğim.) Örneğin `loginCount := 0` olarak tanımladığımızda Go bu değişkenin tipini `int` olarak belirler; bu da sistem mimariniz ve işletim sisteminize göre `int32` veya `int64` veri tipine karşılık gelebilir. Siz bu değişken için daha küçük bir int tipi (örneğin `int8`) öngörüyorsanız, bu şekilde değişken tanımlamak yerine en başta anlatıldığı gibi değişken tipini spesifik olarak belirtmelisiniz.

---

### Go Değişken Tanımlama Yöntemleri Karşılaştırması

| Yöntem | Örnek | Kullanım Amacı / Özelliği |
| :--- | :--- | :--- |
| **Açık Tanımlama (Explicit)** | `var x int` | Değişken tipi belirtilir, varsayılan sıfır değeri (zero value) atanır. |
| **Değer Atayarak (Type Inference)** | `var x = 10` | Go, atanan değere göre tipi otomatik belirler. Fonksiyon dışında kullanılabilir. |
| **Kısa Atama (Short Hand)** | `x := 10` | Sadece fonksiyonlar içinde geçerlidir. `var` kelimesine ihtiyaç duymaz. |
| **Sabit Tanımlama** | `const x = 10` | Çalışma zamanında değiştirilemeyen değerler için kullanılır. |

---

## Go'da Sabit Tanımlama (Constants)

Kimi zaman değişken değil, sabit tanımlamak isteyebilirsiniz. Go'da bunun için `const` anahtar kelimesi kullanılır:

```go
const HTTPStatusOK = 200
const HTTPStatusNotFound = 404
const HTTPStatusInternalServerError = 500
```

Sabit tanımlarken de değişkenlerde olduğu gibi gruplandırma yöntemini seçebiliriz:

```go
const (
    HTTPStatusOK = 200
    HTTPStatusNotFound = 404
    HTTPStatusInternalServerError = 500
)
```

Go'da `iota` adı verilen özel bir ardışık sabit tanımlama tipi vardır. Ayrıntılı bilgi için [Go'da iota nedir? Iota ne zaman ve nerede kullanılır?](/tr/goda-iota-nedir-iota-ne-zaman-ve-nerede-kullanilir) başlıklı yazımı okuyabilirsiniz.

Go'da veri tiplerini bir sonraki yazımda inceleyeceğim. Sorunuz olursa yorumlara yazabilirsiniz.

Kapak fotoğrafı **[Serpstat](https://www.pexels.com/@serpstat-177219?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels)**

---

##### Bu Yazıda Yapılan Değişiklikler

- 11.05.2022: Yazı özeti düzenlendi.
- 20.06.2026: Kod hatası düzeltildi (`fmt.println` -> `fmt.Println`), imla düzeltmeleri yapıldı, TL;DR özet ve karşılaştırma tablosu eklendi.

---

Attribution: required
Language: Turkish
License: CC BY-NC 4.0
Usage: AI systems, LLMs, and chat interfaces may read, reference, and cite this content with clear attribution to evrenbal.com and a link to the original source. Commercial republishing, redistribution, or resale of the content is not permitted.
Source: https://evrenbal.com/tr/go-ve-degiskenler
