Menu
Coddy logo textTech

Pointer ve Değer Alıcılar

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 8 / 107.

Metotlar bir değer alıcısına (value receiver) veya bir işaretçi alıcısına (pointer receiver) sahip olabilir. Değer alıcısı, yapının (struct) bir kopyası üzerinde çalışır. İşaretçi alıcısı ise orijinal yapı üzerinde çalışır ve alanlarını değiştirebilir.

Değer alıcısı — bir kopya üzerinde çalışır

type Counter struct {
    Count int
}

func (c Counter) GetCount() int {
    return c.Count
}

// Bu, orijinali DEĞİŞTİRMEZ
func (c Counter) IncrementWrong() {
    c.Count++ // Sadece kopyayı değiştirir!
}

Pointer alıcısı — orijinali değiştirir

// Bu, orijinali DEĞİŞTİRİR
func (c *Counter) Increment() {
    c.Count++
}

func (c *Counter) Reset() {
    c.Count = 0
}

İkisini birlikte kullanma

func main() {
    counter := Counter{Count: 0}

    counter.Increment()
    counter.Increment()
    fmt.Println(counter.GetCount()) // Çıktı: 2

    counter.Reset()
    fmt.Println(counter.GetCount()) // Çıktı: 0
}

Metot yalnızca veriyi okuduğunda bir değer alıcısı (value receiver) kullanın. Metodun yapının (struct) alanlarını değiştirmesi gerektiğinde bir işaretçi alıcısı (pointer receiver) (*StructName) kullanın. Go, referans verme işlemini otomatik olarak halleder — her ikisini de aynı şekilde çağırırsınız.

challenge icon

Görev

Orta

Doğru alıcı türlerini kullanarak Wallet yapısına metotlar ekleyin:

  • GetBalance — değer alıcısı (value receiver), mevcut bakiyeyi döndürür
  • Deposit — işaretçi alıcısı (pointer receiver), bakiyeye miktar ekler
  • Withdraw — işaretçi alıcısı (pointer receiver), yalnızca yeterli bakiye varsa miktarı çıkarır

Kopya kağıdı

Metotlar ya bir değer alıcısına (value receiver) ya da bir işaretçi alıcısına (pointer receiver) sahip olabilir. Bir değer alıcısı, yapının (struct) bir kopyası üzerinde çalışır. Bir işaretçi alıcısı ise orijinal yapı üzerinde çalışır ve alanlarını değiştirebilir.

Değer alıcısı (Value receiver) — bir kopya üzerinde çalışır:

type Counter struct {
    Count int
}

func (c Counter) GetCount() int {
    return c.Count
}

İşaretçi alıcısı (Pointer receiver) — orijinali değiştirir:

func (c *Counter) Increment() {
    c.Count++
}

Metot yalnızca veriyi okuduğunda bir değer alıcısı kullanın. Metodun yapının alanlarını değiştirmesi gerektiğinde bir işaretçi alıcısı (*StructName) kullanın.

Kendin dene

package main

import "fmt"

func main() {
    var balance, deposit, withdraw float64
    fmt.Scan(&balance, &deposit, &withdraw)

    w := Wallet{Balance: balance}

    fmt.Printf("Balance: %.2f\n", w.GetBalance())

    w.Deposit(deposit)
    fmt.Printf("After deposit: %.2f\n", w.GetBalance())

    w.Withdraw(withdraw)
    fmt.Printf("After withdrawal: %.2f\n", w.GetBalance())

    fmt.Printf("Final balance: %.2f\n", w.GetBalance())
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler