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.
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 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:
- İki alana sahip bir
Sensoryapısı tanımlayın:ID(string) veTemperature(float64) - Sensör bilgilerini
"Sensor [ID]: [temperature]°C"formatında yazdıran, değer alıcılıdisplayReadingadlı bir metot oluşturun. - Sıcaklığa ayarlama değerini ekleyen ve
"Adjusted reading: [new_temperature]°C"yazdıran, değer alıcılıadjustTemperatureadlı bir metot oluşturun. - Bir
Sensorörneği oluşturmak için girdileri ayrıştırın (parse). - Orijinal sıcaklığı göstermek için
displayReadingmetodunu çağırın. - Ayarlama değeri ile
adjustTemperaturemetodunu çağırın. - Orijinal yapının değişmeden kaldığını kanıtlamak için
displayReadingmetodunu 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
}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