Value receiver
- Go kursu
- Başlangıç
- Ders 77/90
- 4 dk
Value receiver ile salt okunur metodları öğrenirsin.
Value receiver
Değer alıcı, metodun alıcının bir kopyasıyla çalıştığı anlamına gelir; metod alıcıyı değiştiremez. Bu, salt okunur hesaplar için açık bir güvencedir:
type Para struct{ Kurus int64 }
func (p Para) String() string {
return fmt.Sprintf("%d,%02d TL", p.Kurus/100, p.Kurus%100)
}
func (p Para) Ekle(q Para) Para {
return Para{p.Kurus + q.Kurus} // yeni değer döner
}Değişmez değer türleri
Standart kütüphanedeki time.Time bu yaklaşımın örneğidir: t.Add(time.Hour) t'yi değiştirmez, yeni bir zaman döndürür. Değişmez türler eşzamanlı kodda güvenle paylaşılır ve hataya daha az açıktır. Değer alıcı ayrıca hem değer hem işaretçi üzerinden çağrılabilir: (&p).String() de çalışır.
Uygulama Para türü
Yukarıdaki Para türünü, String() ve Ekle metodlarıyla yaz. a := Para{1250}, b := a.Ekle(Para{375}) için a ve b'yi yazdır (String() kullanılır).
Başlangıç kodu
package main
import "fmt"
func main() {
// buraya yaz
}Örnek çözüm
package main
import "fmt"
type Para struct{ Kurus int64 }
func (p Para) String() string {
return fmt.Sprintf("%d,%02d TL", p.Kurus/100, p.Kurus%100)
}
func (p Para) Ekle(q Para) Para {
return Para{p.Kurus + q.Kurus}
}
func main() {
a := Para{1250}
b := a.Ekle(Para{375})
fmt.Println(a, b)
}Beklenen çıktı
12,50 TL 16,25 TL
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>a := Para{150}; b := a.Ekle(Para{50})</code> sonrasında <code>a.Kurus</code> kaçtır?
- 200
- 50
- 0
- 150 Doğru cevap
Açıklama: Ekle değer alıcıdır ve yeni bir Para döndürür; a değişmez, b 200 olur.
2 Yeni değer döndür
func (p Para) Ekle(q Para) Para {
____ Para{p.Kurus + q.Kurus}
}
func (p Para) Ekle(q Para) Para {
return Para{p.Kurus + q.Kurus}
}
Açıklama: Değer alıcılı metod sonucu yeni bir değer olarak döndürür.
3 Alıcı türü ve özelliği
| Kavram | Anlamı |
|---|---|
Değer alıcı |
Kopya ile çalışır |
İşaretçi alıcı |
Aslını değiştirir |
time.Time.Add |
Yeni değer döner |
String() string |
Yazdırma biçimi |