Lompat ke konten utama
←

Go dari Nol

Pelajaran 11 dari 15

Fungsi, slice, dan map

Misi: membaca program stok gudang

Setelah pelajaran ini kamu bisa menelusuri program yang menggabungkan fungsi bernilai balik ganda, comma ok, slice, map, dan pengurutan kunci, lalu memprediksi keluarannya.

±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

Gudang sembako di Makassar memproses lima pesanan berurutan. Fungsi ambil memeriksa apakah barang terdaftar dan stoknya cukup, lalu mengurangi stok dan mengembalikan sisanya bersama tanda berhasil. Pesanan yang gagal dikumpulkan ke slice gagal. Di akhir, program mencetak stok semua barang berurutan abjad. Pesanan dan jumlahnya disimpan di dua slice sejajar: pesanan[i] dipasangkan dengan jumlah[i].

package main

import (
	"fmt"
	"sort"
)

func ambil(stok map[string]int, barang string, jumlah int) (int, bool) {
	ada, terdaftar := stok[barang]
	if !terdaftar || ada < jumlah {
		return ada, false
	}
	stok[barang] = ada - jumlah
	return stok[barang], true
}

func main() {
	stok := map[string]int{"beras": 20, "minyak": 6, "gula": 0}
	pesanan := []string{"beras", "minyak", "telur", "minyak", "beras"}
	jumlah := []int{5, 4, 3, 4, 15}

	var gagal []string
	for i, b := range pesanan {
		sisa, ok := ambil(stok, b, jumlah[i])
		if !ok {
			gagal = append(gagal, b)
			continue
		}
		fmt.Println(b, "tersisa", sisa)
	}

	var nama []string
	for n := range stok {
		nama = append(nama, n)
	}
	sort.Strings(nama)
	fmt.Println("Gagal:", gagal)
	for _, n := range nama {
		fmt.Printf("%s=%d ", n, stok[n])
	}
	fmt.Println()
}

Ada satu hal baru di sini. Pelajaran fungsi menunjukkan bahwa argumen bertipe int dikirim sebagai salinan. Map juga dikirim sebagai salinan, tetapi yang disalin hanya pegangannya: salinan itu tetap menunjuk data map yang sama. Karena itu stok[barang] = ada - jumlah di dalam ambil terlihat oleh main. Slice berperilaku serupa untuk elemen-elemennya.

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 yang dicetak baris Gagal:?

package main

import (
	"fmt"
	"sort"
)

func ambil(stok map[string]int, barang string, jumlah int) (int, bool) {
	ada, terdaftar := stok[barang]
	if !terdaftar || ada < jumlah {
		return ada, false
	}
	stok[barang] = ada - jumlah
	return stok[barang], true
}

func main() {
	stok := map[string]int{"beras": 20, "minyak": 6, "gula": 0}
	pesanan := []string{"beras", "minyak", "telur", "minyak", "beras"}
	jumlah := []int{5, 4, 3, 4, 15}

	var gagal []string
	for i, b := range pesanan {
		sisa, ok := ambil(stok, b, jumlah[i])
		if !ok {
			gagal = append(gagal, b)
			continue
		}
		fmt.Println(b, "tersisa", sisa)
	}

	var nama []string
	for n := range stok {
		nama = append(nama, n)
	}
	sort.Strings(nama)
	fmt.Println("Gagal:", gagal)
	for _, n := range nama {
		fmt.Printf("%s=%d ", n, stok[n])
	}
	fmt.Println()
}
Pilih satu jawaban

Latihan 2 dari 4

Apa baris terakhir yang dicetak?

package main

import (
	"fmt"
	"sort"
)

func ambil(stok map[string]int, barang string, jumlah int) (int, bool) {
	ada, terdaftar := stok[barang]
	if !terdaftar || ada < jumlah {
		return ada, false
	}
	stok[barang] = ada - jumlah
	return stok[barang], true
}

func main() {
	stok := map[string]int{"beras": 20, "minyak": 6, "gula": 0}
	pesanan := []string{"beras", "minyak", "telur", "minyak", "beras"}
	jumlah := []int{5, 4, 3, 4, 15}

	var gagal []string
	for i, b := range pesanan {
		sisa, ok := ambil(stok, b, jumlah[i])
		if !ok {
			gagal = append(gagal, b)
			continue
		}
		fmt.Println(b, "tersisa", sisa)
	}

	var nama []string
	for n := range stok {
		nama = append(nama, n)
	}
	sort.Strings(nama)
	fmt.Println("Gagal:", gagal)
	for _, n := range nama {
		fmt.Printf("%s=%d ", n, stok[n])
	}
	fmt.Println()
}
Pilih satu jawaban

Latihan 3 dari 4

Mengapa beras bernilai 0 di baris terakhir, padahal argumen Go dikirim sebagai salinan?

package main

import (
	"fmt"
	"sort"
)

func ambil(stok map[string]int, barang string, jumlah int) (int, bool) {
	ada, terdaftar := stok[barang]
	if !terdaftar || ada < jumlah {
		return ada, false
	}
	stok[barang] = ada - jumlah
	return stok[barang], true
}

func main() {
	stok := map[string]int{"beras": 20, "minyak": 6, "gula": 0}
	pesanan := []string{"beras", "minyak", "telur", "minyak", "beras"}
	jumlah := []int{5, 4, 3, 4, 15}

	var gagal []string
	for i, b := range pesanan {
		sisa, ok := ambil(stok, b, jumlah[i])
		if !ok {
			gagal = append(gagal, b)
			continue
		}
		fmt.Println(b, "tersisa", sisa)
	}

	var nama []string
	for n := range stok {
		nama = append(nama, n)
	}
	sort.Strings(nama)
	fmt.Println("Gagal:", gagal)
	for _, n := range nama {
		fmt.Printf("%s=%d ", n, stok[n])
	}
	fmt.Println()
}
Pilih satu jawaban

Latihan 4 dari 4

Apa yang dikembalikan panggilan ambil(stok, "telur", 3)?

package main

import (
	"fmt"
	"sort"
)

func ambil(stok map[string]int, barang string, jumlah int) (int, bool) {
	ada, terdaftar := stok[barang]
	if !terdaftar || ada < jumlah {
		return ada, false
	}
	stok[barang] = ada - jumlah
	return stok[barang], true
}

func main() {
	stok := map[string]int{"beras": 20, "minyak": 6, "gula": 0}
	pesanan := []string{"beras", "minyak", "telur", "minyak", "beras"}
	jumlah := []int{5, 4, 3, 4, 15}

	var gagal []string
	for i, b := range pesanan {
		sisa, ok := ambil(stok, b, jumlah[i])
		if !ok {
			gagal = append(gagal, b)
			continue
		}
		fmt.Println(b, "tersisa", sisa)
	}

	var nama []string
	for n := range stok {
		nama = append(nama, n)
	}
	sort.Strings(nama)
	fmt.Println("Gagal:", gagal)
	for _, n := range nama {
		fmt.Printf("%s=%d ", n, stok[n])
	}
	fmt.Println()
}
Pilih satu jawaban

Catatanmu

Memuat catatan…

tersimpan otomatis, ikut tercetak · 0/4.000

Luluskan semua latihan dulu untuk menandai pelajaran ini selesai.

Lanjutkan ke