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 *Item dan 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, seperti sword (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 mengembalikan nil kalau tidak ada yang cocok.
  • List() mencetak Describe() setiap item di barisnya sendiri, lalu satu baris total.
  • TotalWeight() mengembalikan jumlah semua berat.
  • TotalValue() mengembalikan jumlah semua nilai.
  • Counts() mengembalikan map[string]int dari sebuah nama ke jumlah item dengan nama itu.

main.go sudah ditulis untukmu. File ini:

  1. Membuat beberapa item, dan menambahkannya ke inventaris.
  2. Mencetak daftar inventaris.
  3. Menghapus satu item berdasarkan nama.
  4. Mencetak daftarnya lagi.
  5. Mencoba menghapus item yang tidak ada, mencoba membuat item dengan berat yang buruk, dan menambahkan ramuan kedua.
  6. 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

  • inventory adalah nama package sekaligus nama folder. Modulnya bernama inventorysystem, jadi baris import-nya "inventorysystem/inventory".
  • Field-nya berhuruf kecil, jadi main tidak bisa mengubah berat sebuah item. Itulah sebabnya Name() ada, dan mengapa main menulis removed.Name().
  • Nilai Item tidak berubah, tetapi nilai Inventory berubah, jadi Add dan Remove butuh receiver pointer. Aturan dari Bab 27 lalu memberi receiver pointer pada metode Inventory lainnya. Tidak ada metode Item yang mengubahnya, jadi aturan 3 membolehkan receiver nilai di sana. Item memakai receiver pointer supaya sesuai dengan NewItem, yang mengembalikan *Item. Slice-nya menyimpan *Item, supaya Remove bisa mengembalikan nil ketika tidak ada yang cocok.
  • Remove menelusuri inv.items dengan range, mencari name yang cocok, lalu menghapusnya dengan baris append dari Bab 22. Tugaskan hasilnya kembali ke inv.items.
  • Pakai fmt.Printf untuk baris total: " Totals: %.2fkg, %dg\n".
  • Describe mengembalikan string, bukan mencetaknya, supaya List yang mengatur tampilan setiap baris. fmt.Sprintf membangunnya.
  • counts[item.name]++ berhasil pada kunci yang belum ada, karena nilai nol int adalah 0, 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.