Materi
Usaha katering di Surabaya menghitung tagihan tiga pesanan. Tipe Katering menyimpan daftar harga dan jumlah pesanan yang sudah diproses. Method Hitung menjumlahkan harga dikali porsi untuk setiap menu, dan mengembalikan error yang membungkus ErrMenuTidakAda bila ada menu yang tidak dijual. main menolak pesanan semacam itu, menjumlahkan omzet pesanan lainnya, lalu mencetak ringkasan. Harga ditulis dalam Rupiah tanpa titik ribuan, karena Go mencetak bilangan bulat apa adanya: Rp1.110.000 tercetak 1110000.
package main
import (
"errors"
"fmt"
)
var ErrMenuTidakAda = errors.New("menu tidak ada")
type Pesanan struct {
Pelanggan string
Item map[string]int
}
type Katering struct {
Harga map[string]int
Diproses int
}
func (k *Katering) Hitung(p Pesanan) (int, error) {
total := 0
for menu, porsi := range p.Item {
harga, ada := k.Harga[menu]
if !ada {
return 0, fmt.Errorf("pesanan %s: %w", p.Pelanggan, ErrMenuTidakAda)
}
total += harga * porsi
}
k.Diproses++
return total, nil
}
func main() {
k := Katering{Harga: map[string]int{"nasi kotak": 25000, "snack": 12000}}
daftar := []Pesanan{
{"Bu Wati", map[string]int{"nasi kotak": 30, "snack": 30}},
{"Pak Hadi", map[string]int{"tumpeng": 1}},
{"Mbak Lina", map[string]int{"snack": 15}},
}
omzet := 0
for _, p := range daftar {
total, err := k.Hitung(p)
if errors.Is(err, ErrMenuTidakAda) {
fmt.Println("Ditolak:", err)
continue
}
omzet += total
fmt.Println(p.Pelanggan, total)
}
fmt.Println("Diproses:", k.Diproses, "Omzet:", omzet)
}Map p.Item ditelusuri dengan range, jadi urutan menunya tidak tetap. Urutan itu tidak memengaruhi hasil di sini: penjumlahan tidak bergantung urutan, dan pesanan berisi menu yang tidak dijual pasti ditolak. Literal Pesanan di daftar ditulis tanpa nama field; nilainya diisi menurut urutan field di deklarasi struct.