Menu
Coddy logo textTech

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.

quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

challenge icon

Görev

Kolay

Bu 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:

  1. İki alana sahip bir Account yapısı tanımlayın: Name (string) ve Balance (float64)
  2. Verilen tutarı hesap bakiyesine ekleyen, işaretçi alıcılı deposit adında bir metot oluşturun
  3. Verilen tutarı hesap bakiyesinden çıkaran, işaretçi alıcılı withdraw adında bir metot oluşturun
  4. Hesap bilgilerini "Account: [name], Balance: $[balance]" formatında yazdıran, değer alıcılı (value receiver) displayBalance adında bir metot oluşturun
  5. Bir Account örneği oluşturmak için girdileri ayrıştırın
  6. Başlangıç bakiyesini göstermek için displayBalance metodunu çağırın
  7. İşlem tutarı ile deposit metodunu çağırın
  8. Para yatırma işleminden sonraki bakiyeyi göstermek için displayBalance metodunu çağırın
  9. İşlem tutarı ile withdraw metodunu çağırın
  10. Son bakiyeyi göstermek için displayBalance metodunu ç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
}
quiz iconKendini test et

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