CodeBlanks Logo Icon CodeBlanks

Pointer receiver

Pointer receiver ile metoddan struct'ı değiştirmeyi öğrenirsin.

Pointer receiver

Metodun alıcıyı değiştirmesi gerekiyorsa işaretçi alıcı kullanılır: func (h *Hesap). Değer alıcıda metod bir kopya üzerinde çalışır ve değişiklik kaybolur:

type Hesap struct{ Bakiye float64 }

func (h *Hesap) Yatir(t float64) {
    h.Bakiye += t
}

h := Hesap{}
h.Yatir(100)          // Go otomatik &h kullanır
fmt.Println(h.Bakiye)  // 100

Hangi alıcı?

Kural basit: metod alıcıyı değiştiriyorsa, struct büyükse ya da içinde sync.Mutex gibi kopyalanmaması gereken alan varsa işaretçi; küçük ve değişmeyen veri için değer. Bir türün metodları tutarlı olmalıdır: biri işaretçi alıcı kullanıyorsa genellikle hepsi kullanır. h.Yatir() çağrısında Go adresi kendisi alır, ama yalnızca adreslenebilir değişkenlerde (ör. Hesap{}.Yatir(1) derlenmez).

Uygulama Banka hesabı

Hesap için işaretçi alıcılı Yatir(t float64) ve Cek(t float64) error metodlarını yaz; yetersiz bakiyede errors.New("yetersiz bakiye") dönsün. 100 yatır, 30 çek, sonra 200 çekmeyi dene; hatayı ve son bakiyeyi yazdır.

Başlangıç kodu

main.go
package main

import (
    "errors"
    "fmt"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "errors"
    "fmt"
)

type Hesap struct{ Bakiye float64 }

func (h *Hesap) Yatir(t float64) { h.Bakiye += t }

func (h *Hesap) Cek(t float64) error {
    if t > h.Bakiye {
        return errors.New("yetersiz bakiye")
    }
    h.Bakiye -= t
    return nil
}

func main() {
    var h Hesap
    h.Yatir(100)
    h.Cek(30)
    err := h.Cek(200)
    fmt.Println(err, h.Bakiye)
}

Beklenen çıktı

yetersiz bakiye 70

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 <code>func (h Hesap) Yatir(t float64) { h.Bakiye += t }</code> çağrıldıktan sonra bakiye değişir mi?

  • Hayır; değer alıcı kopyayı değiştirir Doğru cevap
  • Evet
  • Derlenmez
  • Yalnızca ilk çağrıda

Açıklama: Değer alıcı çağrıda struct'ın kopyasını alır; değişikliğin kalması için *Hesap gerekir.

2 Değiştiren metod

Soru
func (h ____Hesap) Cek(t float64) {
    h.Bakiye -= t
}
Cevap
func (h *Hesap) Cek(t float64) {
    h.Bakiye -= t
}

Açıklama: *Hesap alıcısı metodun asıl hesabı değiştirmesini sağlar.

3 Durum ve alıcı

Kavram Anlamı
Bakiyeyi değiştir *Hesap
Alanı oku, küçük struct Hesap (değer)
Mutex içeren struct *T
h.Yatir(1) Go &h alır

Başlangıç bölümündeki tüm dersler