Pointer sebagai Nilai Map
Termasuk bagian Logika & Alur dalam perjalanan GO di Coddy. Pelajaran 27 dari 68.
Meskipun menyimpan struct secara langsung di map berguna, menyimpan pointer ke struct memberikan kemampuan yang kuat: kamu dapat mengubah data struct asli secara langsung melalui map. Pendekatan ini penting saat kamu perlu memperbarui datamu setelah menyimpannya.
Saat kamu menyimpan pointer ke struct sebagai nilai map, kamu menyimpan alamat memori struct tersebut, bukan salinannya. Berikut cara mendeklarasikan dan menggunakan map seperti ini:
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},
}Keunggulan utamanya terlihat jelas saat kamu perlu mengubah data. Karena kamu bekerja dengan pointer, perubahan yang dilakukan melalui map memengaruhi struct asli:
// Perbarui harga laptop langsung melalui map
products["laptop"].Price = 899.99
fmt.Println(products["laptop"].Price) // mencetak: 899.99Pola ini sangat berguna dalam aplikasi yang mengharuskan kamu sering memperbarui data yang tersimpan, seperti sistem inventaris, profil pengguna, atau situasi apa pun ketika map berfungsi sebagai penyimpanan data utama dan perubahan perlu dipertahankan.
Tantangan
MudahBuat sistem manajemen inventaris sederhana yang menunjukkan manfaat penggunaan pointer ke struct sebagai nilai map. Tantangan ini menunjukkan cara map berbasis pointer memungkinkan kamu mengubah data yang tersimpan secara langsung, sehingga sistem inventarismu efisien dan cepat menanggapi pembaruan.
Kamu akan menerima tiga input:
- Sebuah string yang mewakili jumlah produk (misalnya,
"4") - Sebuah string berisi data produk dengan format:
"name1:price1:quantity1,name2:price2:quantity2,name3:price3:quantity3"(misalnya,"laptop:999.99:5,mouse:25.50:20,keyboard:75.00:15,monitor:299.99:8") - Sebuah string berisi operasi pembaruan dengan format:
"operation1:product1:value1,operation2:product2:value2"dengan operasi berupa"price"atau"quantity"(misalnya,"price:laptop:899.99,quantity:mouse:25,price:keyboard:65.00")
Tugasmu adalah:
- Definisikan struct
Productdengan field berikut:Price(float64), harga produkQuantity(int), jumlah stok produk
- Buat map dengan nama produk (string) sebagai key dan pointer ke struct
Productsebagai nilai - Parse data produk dari input kedua:
- Pisahkan input berdasarkan koma untuk mendapatkan setiap entri produk
- Untuk setiap entri, pisahkan berdasarkan titik dua untuk memisahkan nama, harga, dan jumlah
- Ubah string harga menjadi float64 dan string jumlah menjadi integer
- Buat struct
Productdan simpan pointer ke struct tersebut di map
- Saat melakukan parsing, simpan nama produk dalam slice terpisah sesuai urutannya di input. Go mengunjungi key dalam map dengan urutan acak, jadi slice inilah yang mempertahankan urutan setiap daftar sesuai input.
- Tampilkan inventaris awal dengan header
"Initial Inventory:" - Tampilkan setiap produk dengan format:
"[name]: $[price] (Stock: [quantity])" - Parse dan terapkan operasi pembaruan dari input ketiga:
- Pisahkan input berdasarkan koma untuk mendapatkan setiap operasi
- Untuk setiap operasi, pisahkan berdasarkan titik dua untuk mendapatkan jenis operasi, nama produk, dan nilai baru
- Perbarui field yang sesuai secara langsung melalui pointer dalam map
- Cetak setiap pembaruan dengan format:
"Updated [product]: [field] changed to [new_value]"
- Tampilkan inventaris yang diperbarui dengan header
"Updated Inventory:" - Tampilkan setiap produk lagi dengan format yang sama seperti tampilan awal
- Hitung dan tampilkan total nilai inventaris:
"Total Inventory Value: $[total_value]"
Gunakan package strconv untuk mengubah string harga dan jumlah menjadi tipe numerik yang sesuai. Format semua harga hingga 2 angka desimal saat ditampilkan. Tantangan ini menunjukkan bahwa menyimpan pointer dalam map memungkinkan kamu mengubah data struct asli secara langsung, sehingga pembaruan inventaris berlaku seketika dan tetap tersimpan tanpa perlu menetapkan ulang nilai ke map.
Coba sendiri
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// Baca input
var numProductsStr string
var productDataStr string
var operationsStr string
fmt.Scanln(&numProductsStr)
fmt.Scanln(&productDataStr)
fmt.Scanln(&operationsStr)
// TODO: Definisikan struct Product di sini
// TODO: Buat map untuk menyimpan pointer ke produk
// TODO: Buat slice untuk menjaga urutan produk (agar output konsisten)
// TODO: Uraikan data produk dan isi map
// Ingat untuk:
// - Pisahkan productDataStr berdasarkan koma untuk mendapatkan setiap entri
// - Untuk setiap entri, pisahkan berdasarkan titik dua untuk mendapatkan nama, harga, dan jumlah
// - Ubah string harga dan jumlah ke tipe data yang sesuai
// - Simpan pointer ke struct Product dalam map
// - Tambahkan nama produk ke slice urutan
// TODO: Tampilkan inventaris awal
// Gunakan slice order untuk menelusuri produk secara konsisten
// Format: "[name]: $[price] (Stock: [quantity])"
// TODO: Uraikan dan terapkan operasi pembaruan
// Ingat untuk:
// - Pisahkan operationsStr berdasarkan koma untuk mendapatkan setiap operasi
// - Untuk setiap operasi, pisahkan berdasarkan titik dua untuk mendapatkan jenis, nama, dan nilai
// - Perbarui field yang sesuai secara langsung melalui pointer map
// - Cetak pesan pembaruan untuk setiap operasi
// TODO: Tampilkan inventaris yang telah diperbarui
// Sekali lagi, gunakan slice order agar output konsisten
// Hitung nilai total saat menampilkan inventaris
// TODO: Hitung dan tampilkan nilai total inventaris
// Format: "Total Inventory Value: $[total_value]"
}Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Logika & Alur
1Alur Kontrol Lanjutan
switch dengan `fallthrough`Keluar dari Perulangan BersarangMelanjutkan Perulangan TertentuPernyataan `goto`Rangkuman, Kontrol Perulangan Lanjutan4Proyek: Daftar Tugas Sederhana
Menyiapkan ProyekMenambahkan Tugas2Struct dan Method
Mendefinisikan Method pada StructPenerima NilaiPenerima PointerMemilih PenerimaMethod vs FungsiRekap: Perilaku Struct5Map secara Mendalam
Map Berisi StructPointer sebagai Nilai MapMenguji Map NilMembandingkan MapRingkasan: Penghitung Frekuensi Kata8Proyek: Inventaris Sederhana
Gambaran Umum ProyekMemeriksa Stok3Interface (Dasar)
Apa Itu Interface?Mendefinisikan InterfaceMengimplementasikan InterfaceMenggunakan Tipe InterfaceInterface KosongType AssertionType SwitchRingkasan: Bentuk dan PerilakuLatihan sendiri: Compiler Go online