Mini-proyek Bagian 6: Inventaris
Proyek ini memakai bab-bab Bagian 6: struct, metode, pointer, slice,
map, dan package dengan nama yang diekspor. Item dan
Inventory mengelola sekantong barang.
Apa yang harus dibuat
Dua tipe dalam satu package, inventory.
Item, satu barang yang bisa
dikumpulkan:
NewItem(name, weight, value)mengembalikan*Itemdan error. Nama tidak boleh kosong, dan berat serta nilai tidak boleh di bawah 0.- Field yang tidak diekspor:
name(string),weight(float64),value(int). Name()mengembalikan namanya.Describe()mengembalikan ringkasan satu baris, sepertisword (3.5kg, 50g).
Inventory, wadah berisi item:
New()mengembalikan inventaris kosong, sebagai*Inventory.- Satu field yang tidak diekspor:
items, slice berisi*Item. Add(item)menambahkan sebuah item.Remove(name)menghapus item pertama dengan nama itu, dan mengembalikannya. Metode ini mengembalikannilkalau tidak ada yang cocok.List()mencetakDescribe()setiap item di barisnya sendiri, lalu satu baris total.TotalWeight()mengembalikan jumlah semua berat.TotalValue()mengembalikan jumlah semua nilai.Counts()mengembalikanmap[string]intdari sebuah nama ke jumlah item dengan nama itu.
main.go sudah ditulis untukmu. File ini:
- Membuat beberapa item, dan menambahkannya ke inventaris.
- Mencetak daftar inventaris.
- Menghapus satu item berdasarkan nama.
- Mencetak daftarnya lagi.
- Mencoba menghapus item yang tidak ada, mencoba membuat item dengan berat yang buruk, dan menambahkan ramuan kedua.
- Mencetak jumlahnya, dengan nama yang diurutkan.
Program yang sudah selesai mencetak:
Inventory (3 items):
- sword (3.5kg, 50g)
- shield (5.0kg, 30g)
- potion (0.2kg, 5g)
Totals: 8.70kg, 85g
(removed sword)
Inventory (2 items):
- shield (5.0kg, 30g)
- potion (0.2kg, 5g)
Totals: 5.20kg, 35g
(no lantern to remove)
Error: item rock: weight -1.0 is below 0
Counts:
potion: 2
shield: 1
Susunan file
Proyek ini adalah modul dengan dua package, seperti di Bagian 5.
Kedua versi ada di projects/05-inventory/:
starter/
go.mod
main.go
inventory/
inventory.go
finished/
go.mod
main.go
inventory/
inventory.go
Untuk mengerjakan starter, masuk ke foldernya dan pakai
go run .:
cd projects/05-inventory/starter
go run .
Untuk menjalankan versi yang sudah selesai:
cd projects/05-inventory/finished
go run .
Starter bisa langsung dijalankan. Starter mencetak baris-baris
pengganti. main.go sudah selesai, dan semua TODO ada di
inventory/inventory.go. Jalankan go vet ./...
di folder yang sama untuk memeriksa kedua package.
Petunjuk
inventoryadalah nama package sekaligus nama folder. Modulnya bernamainventorysystem, jadi baris import-nya"inventorysystem/inventory".- Field-nya berhuruf kecil, jadi
maintidak bisa mengubah berat sebuah item. Itulah sebabnyaName()ada, dan mengapamainmenulisremoved.Name(). - Nilai
Itemtidak berubah, tetapi nilaiInventoryberubah, jadiAdddanRemovebutuh receiver pointer. Aturan dari Bab 27 lalu memberi receiver pointer pada metodeInventorylainnya. Tidak ada metodeItemyang mengubahnya, jadi aturan 3 membolehkan receiver nilai di sana.Itemmemakai receiver pointer supaya sesuai denganNewItem, yang mengembalikan*Item. Slice-nya menyimpan*Item, supayaRemovebisa mengembalikannilketika tidak ada yang cocok. Removemenelusuriinv.itemsdenganrange, mencarinameyang cocok, lalu menghapusnya dengan barisappenddari Bab 22. Tugaskan hasilnya kembali keinv.items.- Pakai
fmt.Printfuntuk baris total:" Totals: %.2fkg, %dg\n". Describemengembalikan string, bukan mencetaknya, supayaListyang mengatur tampilan setiap baris.fmt.Sprintfmembangunnya.counts[item.name]++berhasil pada kunci yang belum ada, karena nilai nol int adalah0, seperti penghitung kata di Bab 23.
Yang boleh dipakai
Apa saja dari Bagian 2 sampai 6: variabel, alur kendali, fungsi, error, package, slice, map, struct, metode, dan pointer.
Selesai?
Ketika output go run . milikmu sama dengan yang di atas,
kamu selesai. Proyek berikutnya adalah Pertempuran Monster.