Menu
Coddy logo textTech

Value Receiver'lar

Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 7 / 68.

Bir değeri alıcılı (value receiver) bir metot tanımladığınızda, metot orijinal struct örneği yerine onun bir kopyası üzerinde çalışır. Bu, metot içinde alıcı (receiver) üzerinde yapılan herhangi bir değişikliğin orijinal struct değişkenini etkilemeyeceği anlamına gelir.

type Counter struct {
    Value int
}

func (c Counter) increment() {
    c.Value++  // Bu, orijinali değil, kopyayı değiştirir
}

Bu örnekte, increment metodu bir değer alıcısına (c Counter) sahiptir. Bu metodu bir Counter örneği üzerinde çağırdığınızda, Go yapının (struct) bir kopyasını oluşturur ve bunu metoda iletir. Metot içindeki c.Value üzerinde yapılan herhangi bir değişiklik yalnızca bu kopyayı etkiler.

Değer alıcılar (value receivers), metodunuzun struct içindeki verileri değiştirmeden sadece okuması gerektiği durumlarda kullanışlıdır. Orijinal verinin değişmeden kalmasını garanti ettikleri için kullanımları güvenlidir; bu da kodunuzu daha öngörülebilir hale getirir ve istenmeyen yan etkileri önler.

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 sıcaklık izleme sistemi oluşturarak değer alıcıları (value receivers) ile çalışma pratiği yapacaksınız. Bir Sensor yapısı (struct) oluşturacak ve değer alıcılarının yapının kopyalarıyla nasıl çalıştığını gösteren metotlar tanımlayacaksınız.

Üç girdi alacaksınız:

  • Sensör kimliğini temsil eden bir dize (örneğin, "TEMP001")
  • Mevcut sıcaklık okumasını temsil eden bir dize (örneğin, "23.5")
  • Sıcaklık ayarlama değerini temsil eden bir dize (örneğin, "2.0")

Göreviniz şunları yapmaktır:

  1. İki alana sahip bir Sensor yapısı tanımlayın: ID (string) ve Temperature (float64)
  2. Sensör bilgilerini "Sensor [ID]: [temperature]°C" formatında yazdıran, değer alıcılı displayReading adlı bir metot oluşturun.
  3. Sıcaklığa ayarlama değerini ekleyen ve "Adjusted reading: [new_temperature]°C" yazdıran, değer alıcılı adjustTemperature adlı bir metot oluşturun.
  4. Bir Sensor örneği oluşturmak için girdileri ayrıştırın (parse).
  5. Orijinal sıcaklığı göstermek için displayReading metodunu çağırın.
  6. Ayarlama değeri ile adjustTemperature metodunu çağırın.
  7. Orijinal yapının değişmeden kaldığını kanıtlamak için displayReading metodunu tekrar çağırın.

Bu meydan okuma, değer alıcılı metotların yapının kopyaları üzerinde çalıştığını, dolayısıyla adjustTemperature metodu çağrıldıktan sonra bile orijinal yapının sıcaklık değerinin değişmeden kalacağını gösterecektir. Sıcaklık değerleri bir ondalık basamak hassasiyetiyle görüntülenmelidir.

Kopya kağıdı

Değer alıcılar (Value receivers), orijinal üzerinde değil, struct örneğinin bir kopyası üzerinde çalışır. Metot içinde yapılan değişiklikler orijinal struct'ı etkilemez.

type Counter struct {
    Value int
}

func (c Counter) increment() {
    c.Value++  // Bu, orijinali değil, kopyayı değiştirir
}

Değer alıcılar, metotların orijinal struct'ı değiştirmeden sadece verileri okuması gerektiğinde kullanışlıdır; bu da kodu daha öngörülebilir hale getirir ve istenmeyen yan etkileri önler.

Kendin dene

package main

import (
    "fmt"
    "strconv"
)

// TODO: Sensor yapınızı (struct) burada tanımlayın

// TODO: Değer alıcılı (value receiver) displayReading metodunuzu burada tanımlayın

// TODO: Değer alıcılı (value receiver) adjustTemperature metodunuzu burada tanımlayın

func main() {
    // Girdileri oku
    var sensorID string
    var tempStr string
    var adjustStr string
    
    fmt.Scanln(&sensorID)
    fmt.Scanln(&tempStr)
    fmt.Scanln(&adjustStr)
    
    // Sıcaklık ve ayarlama değerlerini ayrıştır
    temperature, _ := strconv.ParseFloat(tempStr, 64)
    adjustment, _ := strconv.ParseFloat(adjustStr, 64)
    
    // TODO: Bir Sensor örneği oluşturun ve gerekli metodları çağırın
    
}
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