Menu
Coddy logo textTech

Struct İşaretçileri

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 20 / 107.

Yapılarla çalışırken, büyük veri yapılarını kopyalamaktan kaçınmak ve özgün yapıyı değiştirmek için genellikle işaretçiler kullanırsın. Bir yapıya işaretçi, o yapı örneğinin bellek adresini tutar.

Mevcut bir struct üzerinde & operatörünü kullanarak veya adres operatörünü doğrudan bir struct değişmez değeriyle kullanarak bir struct işaretçisi oluşturabilirsin.

type Person struct {
    Name string
    Age  int
}

p := Person{Name: "Alice", Age: 30}
ptr := &p  // mevcut struct'a işaretçi

// Veya doğrudan oluştur
ptr2 := &Person{Name: "Bob", Age: 25}

Go, bir işaretçi üzerinden struct alanlarına erişirken kullanışlı bir kısayol sağlar. (*ptr).Name yazmak yerine doğrudan ptr.Name yazabilirsiniz. Go, işaretçinin referansını sizin için otomatik olarak kaldırır.

ptr := &Person{Name: "Alice", Age: 30}

// Her ikisi de aynı şekilde çalışır
fmt.Println((*ptr).Name)  // açık dereference
fmt.Println(ptr.Name)     // otomatik dereference

Bu otomatik başvurudan çıkarma işlemi, alanlar değiştirilirken de geçerlidir. İşaretçi aracılığıyla yapılan değişiklikler özgün yapıyı etkiler.

p := Person{Name: "Alice", Age: 30}
ptr := &p

ptr.Age = 31           // orijinali değiştirir
fmt.Println(p.Age)     // 31

Struct işaretçileri, Go'nun OOP kalıplarında temel öneme sahiptir. Metotların alıcı durumunu değiştirmesini sağlar, büyük struct'ların işlevlere verimli bir şekilde aktarılmasına olanak tanır ve ağaçlar ile listeler gibi bağlantılı veri yapıları oluşturmanın temelini oluşturur.

challenge icon

Görev

Kolay

Struct işaretçilerinin özgün verileri verimli bir şekilde değiştirmenize nasıl olanak tanıdığını gösteren bir banka hesabı sistemi oluşturalım. İşaretçi işlemleri aracılığıyla güncellenebilen bir hesap oluşturacaksınız.

Kodunuzu iki dosya arasında düzenleyeceksiniz:

  • account.go: BankAccount (string), Owner (float64) ve Balance (string) alanlarına sahip bir AccountNumber struct'ı tanımlayın. Sahip adını ve hesap numarasını parametre olarak alan ve başlangıç bakiyesi 0 olan yeni bir NewAccount'a işaretçi döndüren BankAccount adlı bir işlev oluşturun. Ayrıca bir Deposit işaretçisi ile bir miktarı alan, ardından işaretçi üzerinden bu miktarı hesabın bakiyesine ekleyen bir *BankAccount işlevi oluşturun.
  • main.go: Hesap bilgilerini girdiden okuyun, kurucu işlevinizi (bir işaretçi döndürür) kullanarak bir hesap oluşturun, işaretçiyi kullanarak para yatırın ve bakiyenin değiştirildiğini doğrulamak için hesap ayrıntılarını görüntüleyin.

Aşağıdaki girdiler sağlanacaktır:

  • 1. satır: Sahip adı
  • 2. satır: Hesap numarası
  • 3. satır: Para yatırma miktarı (float)

Çıktı biçimi:

Account: [AccountNumber]
Owner: [Owner]
Balance: [Balance]

Örneğin, John Smith, ACC-12345 ve 500.50 verildiğinde çıktınız şu şekilde olmalıdır:

Account: ACC-12345
Owner: John Smith
Balance: 500.50

NewAccount işlevinizin *BankAccount operatörünü kullanarak & döndürmesi gerektiğini ve Deposit işlevinizin Go'nun otomatik başvuru kaldırma özelliğini kullanarak bakiyeyi doğrudan işaretçi üzerinden değiştirebileceğini unutmayın (örneğin account.Balance yerine (*account).Balance).

Kendin dene

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)
	
	// Sahip adını oku
	ownerName, _ := reader.ReadString('\n')
	ownerName = strings.TrimSpace(ownerName)
	
	// Hesap numarasını oku
	accountNumber, _ := reader.ReadString('\n')
	accountNumber = strings.TrimSpace(accountNumber)
	
	// Yatırılacak tutarı oku
	amountStr, _ := reader.ReadString('\n')
	amountStr = strings.TrimSpace(amountStr)
	amount, _ := strconv.ParseFloat(amountStr, 64)
	
	// TODO: NewAccount fonksiyonunu kullanarak yeni bir hesap oluşturun (bir işaretçi döndürür)
	
	// TODO: Hesap işaretçisini kullanarak Deposit fonksiyonu ile para yatırın
	
	// TODO: Hesap ayrıntılarını istenen formatta yazdırın:
	// Account: [AccountNumber]
	// Owner: [Owner]
	// Balance: [Balance]
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online Go derleyicisi