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.99Bu 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.
Görev
KolayYapı 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:
- Aşağıdaki alanlara sahip bir
Productyapısı tanımlayın:Price(float64) - ürünün fiyatıQuantity(int) - ürünün stok miktarı
- Anahtarları ürün adları (dizeler), değerleri ise
Productyapılarına işaretçiler olan bir harita oluşturun - İ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
Productyapısı oluşturun ve haritada bunun işaretçisini saklayın
- 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.
- Başlık olarak
"Initial Inventory:"kullanarak başlangıç envanterini görüntüleyin - Her ürünü şu biçimde gösterin:
"[name]: $[price] (Stock: [quantity])" - Üçü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]"
- Başlık olarak
"Updated Inventory:"kullanarak güncellenmiş envanteri görüntüleyin - Her ürünü başlangıç görüntüsündekiyle aynı biçimde yeniden gösterin
- 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]"
}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ışlarKendi başına pratik yap: Online Go derleyicisi