Pointer receiver
- Go kursu
- Başlangıç
- Ders 76/90
- 4 dk
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) // 100Hangi 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
package main
import (
"errors"
"fmt"
)
func main() {
// buraya yaz
}Örnek çözüm
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
func (h ____Hesap) Cek(t float64) {
h.Bakiye -= t
}
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 |