Menu
Coddy logo textTech

Map Değeri Olarak Pointer'lar

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

Yapıları doğrudan eşlemelerde depolamak kullanışlı olsa da yapı işaretçilerini depolamak güçlü bir yeteneğin önünü açar: özgün yapı verilerini doğrudan eşleme üzerinden değiştirebilme. Bu yaklaşım, verilerinizi depolandıktan sonra güncellemeniz gerektiğinde çok önemlidir.

Bir struct'a işaretçiyi bir map değeri olarak sakladığınızda, struct'ın bir kopyasını değil, bellekteki adresini saklarsınız. Böyle bir map'i nasıl tanımlayıp kullanacağınız aşağıda gösterilmiştir:

type Product struct {
    Price    float64
    Quantity int
}

products := map[string]*Product{
    "laptop": &Product{Price: 999.99, Quantity: 5},
    "mouse":  &Product{Price: 25.50, Quantity: 20},
}

Temel avantaj, verileri değiştirmeniz gerektiğinde ortaya çıkar. İşaretçilerle çalıştığınız için, map üzerinden yapılan değişiklikler özgün struct'ı etkiler:

// laptop'un fiyatını map üzerinden doğrudan güncelle
products["laptop"].Price = 899.99
fmt.Println(products["laptop"].Price) // yazdırır: 899.99

Bu desen, envanter sistemleri, kullanıcı profilleri veya haritanın birincil veri deponuz olarak hizmet ettiği ve değişikliklerin kalıcı olması gereken herhangi bir senaryo gibi depolanan verileri sık sık güncellemeniz gereken uygulamalarda özellikle değerlidir.

challenge icon

Görev

Kolay

Yapı işaretçilerini harita değerleri olarak kullanmanın gücünü gösteren basit bir envanter yönetim sistemi oluşturun. Bu görev, işaretçi tabanlı haritaların depolanan verilerin doğrudan değiştirilmesini nasıl sağladığını ve envanter sisteminizi güncellemelere karşı verimli ve duyarlı hâle getirdiğini gösterir.

Üç girdi alacaksınız:

  • Ürün sayısını temsil eden bir dize (örneğin, "4")
  • Şu biçimde ürün verilerini içeren bir dize: "name1:price1:quantity1,name2:price2:quantity2,name3:price3:quantity3" (örneğin, "laptop:999.99:5,mouse:25.50:20,keyboard:75.00:15,monitor:299.99:8")
  • Güncelleme işlemlerini şu biçimde içeren bir dize: "operation1:product1:value1,operation2:product2:value2"; işlemler "price" veya "quantity" olabilir (örneğin, "price:laptop:899.99,quantity:mouse:25,price:keyboard:65.00")

Göreviniz:

  1. Aşağıdaki alanlara sahip bir Product yapısı tanımlayın:
    • Price (float64) - ürünün fiyatı
    • Quantity (int) - ürünün stok miktarı
  2. Anahtarları ürün adları (dizeler), değerleri ise Product yapılarına işaretçiler olan bir harita oluşturun
  3. İkinci girdideki ürün verilerini ayrıştırın:
    • Tek tek ürün kayıtlarını elde etmek için girdiyi virgüllere göre bölün
    • Her kayıt için ad, fiyat ve miktarı ayırmak üzere iki nokta üst üste karakterlerine göre bölün
    • Fiyat dizesini float64 değerine, miktar dizesini ise tam sayıya dönüştürün
    • Bir Product yapısı oluşturun ve haritada bunun işaretçisini saklayın
  4. Ayrıştırma sırasında ürün adlarını, girdide göründükleri sırayla ayrı bir dilimde tutun. Go'da bir harita üzerinde gezinmek anahtarları rastgele bir sırada ziyaret eder; bu nedenle her listelemenin girdi sırasını koruyan dilimdir.
  5. Başlık olarak "Initial Inventory:" kullanarak başlangıç envanterini görüntüleyin
  6. Her ürünü şu biçimde gösterin: "[name]: $[price] (Stock: [quantity])"
  7. Üçüncü girdideki güncelleme işlemlerini ayrıştırıp uygulayın:
    • Tek tek işlemleri elde etmek için girdiyi virgüllere göre bölün
    • Her işlem için işlem türünü, ürün adını ve yeni değeri elde etmek üzere iki nokta üst üste karakterlerine göre bölün
    • Uygun alanı doğrudan harita işaretçisi üzerinden güncelleyin
    • Her güncellemeyi şu biçimde yazdırın: "Updated [product]: [field] changed to [new_value]"
  8. Başlık olarak "Updated Inventory:" kullanarak güncellenmiş envanteri görüntüleyin
  9. Her ürünü başlangıç görüntüsündekiyle aynı biçimde yeniden gösterin
  10. Toplam envanter değerini hesaplayıp şu biçimde görüntüleyin: "Total Inventory Value: $[total_value]"

Fiyat ve miktar dizelerini ilgili sayısal türlere dönüştürmek için strconv paketini kullanın. Görüntülerken tüm fiyatları 2 ondalık basamakla biçimlendirin. Bu görev, haritalarda işaretçi saklamanın özgün yapı verilerini doğrudan değiştirmenizi nasıl sağladığını gösterir; böylece değerleri haritaya yeniden atamanıza gerek kalmadan envanter güncellemeleriniz anında uygulanır ve kalıcı olur.

Kendin dene

package main

import (
	"fmt"
	"strconv"
	"strings"
)

func main() {
	// Girdiyi oku
	var numProductsStr string
	var productDataStr string
	var operationsStr string
	
	fmt.Scanln(&numProductsStr)
	fmt.Scanln(&productDataStr)
	fmt.Scanln(&operationsStr)
	
	// TODO: Product struct'ını burada tanımla
	
	// TODO: Ürün pointer'larını saklamak için map oluştur
	
	// TODO: Ürün sırasını korumak için slice oluştur (tutarlı çıktı sağlamak için)
	
	// TODO: Ürün verilerini ayrıştır ve map'i doldur
	// Unutma:
	// - Ayrı girdileri almak için productDataStr'yi virgüllere göre böl
	// - Her girdi için name, price, quantity almak üzere iki nokta üst üste ile böl
	// - price ve quantity string'lerini uygun tiplere dönüştür
	// - Product struct'ına pointer'ı map'te sakla
	// - Ürün adını order slice'ına ekle
	
	// TODO: Display initial inventory
	// Ürünler arasında tutarlı şekilde dolaşmak için order slice'ını kullan
	// Biçim: "[name]: $[price] (Stock: [quantity])"
	
	// TODO: Güncelleme işlemlerini ayrıştır ve uygula
	// Unutma:
	// - Bireysel işlemleri almak için operationsStr'yi virgüllere göre ayır
	// - Her işlem için type, name, value almak üzere iki nokta üst üste ile ayır
	// - Uygun alanı doğrudan map işaretçisi üzerinden güncelle
	// - Her işlem için güncelleme mesajını yazdır
	
	// TODO: Display updated inventory
	// Tutarlı çıktı için yine order dilimini kullan
	// Görüntülerken toplam değeri hesapla
	
	// TODO: Calculate and display total inventory value
	// Format: "Total Inventory Value: $[total_value]"
}
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

Kendi başına pratik yap: Online Go derleyicisi