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.