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.
Görev
OrtaDoğ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ürDeposit— işaretçi alıcısı (pointer receiver), bakiyeye miktar eklerWithdraw— 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())
}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
1Go OOP Temelleri
Harici DosyalarGo Çalışma Alanı ve ModüllerPaketler ve İçe AktarmalarDışa Aktarılan ve Aktarılmayan İsimlerGo'da OOP'ye GirişSınıf Olarak Struct'larStruct'larda Metot TanımlamaPointer ve Değer AlıcılarStruct BaşlatmaYapıcı FonksiyonlarÖzet - Basit Hesap Makinesi4Arayüzler
Arayüzlere GirişÖrtük UygulamaSözleşme Olarak ArayüzBoş Arayüz (any)Tür OnaylamaTür SeçimiArayüz BileşimiStringer ve Error ArayüzleriÖzet - Şekil Hesaplayıcı7Kapsülleme
Dışa Aktarılan ve Aktarılmayan AlanlarPaket Seviyesinde KapsüllemeGetter ve Setter MetotlarıGo'da Bilgi GizlemeÖzet - Öğrenci Kayıtları10Generics (Go 1.18+)
Generics'e GirişTür ParametreleriTür KısıtlamalarıGeneric Struct'larGeneric Metotlar İçin Geçici ÇözümÖzet - Generic Koleksiyon13Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıAbstract Factory KalıbıObserver KalıbıStrategy Kalıbı2Türler ve Struct'lar: Derinlemesine İnceleme
Temel ve Bileşik TürlerÖzel Tür TanımlamalarıStruct EtiketleriAnonim Struct'larİç İçe Geçmiş Struct'larSıfır Değerler ve VarsayılanlarÖzet - Rehber5Kalıtım Yerine Kompozisyon
Go'da Neden Kalıtım YokStruct Gömme TemelleriMetot YükseltmeBirden Fazla Struct GömmeGömme vs AgregasyonGömülü Metotları GölgelemeÖzet - Çalışan Hiyerarşisi8Hata Yönetimi ve OOP
error ArayüzüÖzel Hata TürleriHata Sarmalama (fmt.Errorf)Sentinel Hatalarerrors.Is() ve errors.As()Panic, Defer ve RecoverÖzet - Dosya Ayrıştırıcı3İşaretçiler ve Bellek
Go'da İşaretçi TemelleriStruct İşaretçileriDeğer ile Geçme ve Referans ile Geçmenew() FonksiyonuGo'da Garbage CollectionÖzet - Linked List Oluşturucu6Go'da Polimorfizm
Interface'ler ile PolimorfizmGo'da Duck TypingInterface Karşılama KurallarıPolimorfik KoleksiyonlarDependency InjectionÖzet - Payment Processor9Eşzamanlılık ve OOP
Goroutine TemelleriKanallar ve İletişimTamponlu ve Tamponsuz KanallarSelect İfadesisync.Mutex ve sync.RWMutexsync.WaitGroupThread-Safe Struct TasarımıÖzet - Worker Pool