Lompat ke konten utama
←

Go dari Nol

Pelajaran 15 dari 15

Struct, error, dan goroutine

Misi: membaca program pesanan katering

Setelah pelajaran ini kamu bisa menelusuri program yang menggabungkan struct, method berpenerima pointer, map, error yang dibungkus, dan errors.Is, lalu memprediksi keluarannya dan akibat mengganti jenis penerima.

±17 menitDiperiksa 5 Okt 2026

Latihan di pelajaran ini butuh akun gratis. Progres, kode, dan catatanmu hanya tersimpan di browser ini. Masuk untuk menyimpannya

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.

Latihan

0/4 lulus

Misi akhir modul: luluskan minimal 4 dari 4 tugas. Jawaban diperiksa di server. Lulus berarti kamu memahami contohnya, bukan penilaian seluruh pekerjaanmu.

Latihan 1 dari 4

Apa baris pertama yang dicetak?

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)
}
Pilih satu jawaban

Latihan 2 dari 4

Apa yang dicetak untuk pesanan Pak Hadi?

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)
}
Pilih satu jawaban

Latihan 3 dari 4

Apa baris terakhir yang dicetak?

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)
}
Pilih satu jawaban

Latihan 4 dari 4

Penerima Hitung diubah dari (k *Katering) menjadi (k Katering). Apa yang berubah pada keluaran?

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)
}
Pilih satu jawaban

Catatanmu

Memuat catatan…

tersimpan otomatis, ikut tercetak · 0/4.000

Luluskan semua latihan dulu untuk menandai pelajaran ini selesai.

Lanjutkan ke