Pointer Receiver'lar
Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 8 / 68.
Değer alıcılar (value receivers) struct kopyalarıyla çalışırken, işaretçi alıcılar (pointer receivers) doğrudan orijinal struct örneğiyle çalışır. İşaretçi alıcılı bir metot tanımladığınızda, metot bir kopya yerine struct'a giden bir işaretçi aldığı için orijinal veriyi değiştirebilir.
Bir pointer alıcısı (pointer receiver) oluşturmak için, alıcı bildirimindeki tür adından önce bir yıldız işareti * eklersiniz:
type Person struct {
Name string
Age int
}
func (p *Person) haveBirthday() {
p.Age++ // Bu, orijinal struct'ı değiştirir
}Bu örnekte, (p *Person) bir işaretçi alıcısıdır (pointer receiver). Bir Person örneği üzerinde haveBirthday metodunu çağırdığınızda, metot orijinal yapıya (struct) bir işaretçi alır. Bu işaretçi aracılığıyla yapı alanlarında yapılan herhangi bir değişiklik, orijinal veriyi kalıcı olarak değiştirecektir.
Metotlarınızın struct alanlarını güncellemesi gerektiğinde pointer receiver'lar gereklidir; bu da onları verilerinizin durumunu değiştiren işlemler için mükemmel kılar.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Görev
KolayBu meydan okumada, basit bir banka hesabı sistemi oluşturarak işaretçi alıcılı (pointer receiver) metotlar oluşturma pratiği yapacaksınız. Bir Account yapısı (struct) oluşturacak ve işaretçi alıcıları kullanarak hesap bakiyesini değiştirebilen metotlar tanımlayacaksınız.
Üç girdi alacaksınız:
- Hesap sahibinin adını temsil eden bir dize (örneğin,
"John Smith") - Başlangıç hesap bakiyesini temsil eden bir dize (örneğin,
"1000.50") - Bir işlem tutarını temsil eden bir dize (örneğin,
"250.75")
Göreviniz şunları yapmaktır:
- İki alana sahip bir
Accountyapısı tanımlayın:Name(string) veBalance(float64) - Verilen tutarı hesap bakiyesine ekleyen, işaretçi alıcılı
depositadında bir metot oluşturun - Verilen tutarı hesap bakiyesinden çıkaran, işaretçi alıcılı
withdrawadında bir metot oluşturun - Hesap bilgilerini
"Account: [name], Balance: $[balance]"formatında yazdıran, değer alıcılı (value receiver)displayBalanceadında bir metot oluşturun - Bir
Accountörneği oluşturmak için girdileri ayrıştırın - Başlangıç bakiyesini göstermek için
displayBalancemetodunu çağırın - İşlem tutarı ile
depositmetodunu çağırın - Para yatırma işleminden sonraki bakiyeyi göstermek için
displayBalancemetodunu çağırın - İşlem tutarı ile
withdrawmetodunu çağırın - Son bakiyeyi göstermek için
displayBalancemetodunu çağırın
Bakiye, iki ondalık basamak hassasiyetiyle görüntülenmelidir. Bu meydan okuma, işaretçi alıcılarının, kopyalarla çalışan değer alıcılarının aksine, metotların orijinal yapı verilerini değiştirmesine nasıl izin verdiğini göstermektedir.
Kopya kağıdı
İşaretçi alıcılar (pointer receivers), bir kopya yerine struct'a bir işaretçi alarak doğrudan orijinal struct örneğiyle çalışır. Bu, metotların orijinal veriyi değiştirmesine olanak tanır.
Bir işaretçi alıcı oluşturmak için, alıcı bildirimindeki tür adından önce bir yıldız işareti * ekleyin:
type Person struct {
Name string
Age int
}
func (p *Person) haveBirthday() {
p.Age++ // Bu, orijinal struct'ı değiştirir
}Metotlarınızın struct alanlarını güncellemesi gerektiğinde işaretçi alıcıları kullanın; bu, onları verilerinizin durumunu değiştiren işlemler için mükemmel kılar.
Kendin dene
package main
import (
"fmt"
"strconv"
)
// TODO: Burada Account yapısını (struct) tanımlayın
// TODO: Burada işaretçi alıcılı (pointer receiver) deposit metodunu tanımlayın
// TODO: Burada işaretçi alıcılı (pointer receiver) withdraw metodunu tanımlayın
// TODO: Burada değer alıcılı (value receiver) displayBalance metodunu tanımlayın
func main() {
// Girdiyi oku
var name string
var initialBalanceStr string
var transactionAmountStr string
fmt.Scanln(&name)
fmt.Scanln(&initialBalanceStr)
fmt.Scanln(&transactionAmountStr)
// Dize girdilerini uygun türlere dönüştür
initialBalance, _ := strconv.ParseFloat(initialBalanceStr, 64)
transactionAmount, _ := strconv.ParseFloat(transactionAmountStr, 64)
// TODO: Bir Account örneği oluşturun
// TODO: Başlangıç bakiyesini görüntüleyin, para yatırma işlemini gerçekleştirin, bakiyeyi görüntüleyin, para çekme işlemini gerçekleştirin, son bakiyeyi görüntüleyin
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık ve Akış bölümündeki tüm dersler
1İleri Seviye Kontrol Akışı
`fallthrough` ile Switchİç İçe Döngülerden ÇıkmaBelirli Bir Döngüye Devam Etme`goto` İfadesiÖzet - İleri Seviye Döngü Kontrolü4Proje: Basit Görev Listesi
Proje KurulumuGörev Ekleme2Structlar ve Metotlar
Structlarda Metot TanımlamaValue Receiver'larPointer Receiver'larReceiver SeçimiMetotlar ve FonksiyonlarÖzet - Struct Davranışı5Derinlemesine Map'ler
Struct Map'leriMap Değeri Olarak Pointer'larNil Map KontrolüMap'leri KarşılaştırmaÖzet - Kelime Frekansı Sayacı3Arayüzler (Temeller)
Arayüz Nedir?Bir Arayüz TanımlamaBir Arayüzü UygulamaArayüz Tiplerini KullanmaBoş ArayüzTip OnaylamalarıTip SeçimiÖzet - Şekiller ve Davranışlar