Lewati ke konten

4. Slice, Map, Struct & Method

port := []int{80, 443}
port = append(port, 8080) // [80 443 8080]
fmt.Println(len(port)) // 3
fmt.Println(port[0]) // 80
fmt.Println(port[1:]) // [443 8080]

append mengembalikan slice baru, jadi hasilnya harus disimpan lagi: port = append(port, ...). Indeks di luar batas membuat program panic.

ip := map[string]string{
"web": "10.10.10.2",
"vps": "10.10.10.1",
}
ip["db"] = "10.10.10.3" // tambah / ubah
delete(ip, "db") // hapus
alamat, ada := ip["mail"] // "", false
if !ada {
fmt.Println("mail belum terdaftar")
}

Kunci yang tidak ada mengembalikan nilai nol — makanya penghitung bisa langsung hitung[kata]++ tanpa inisialisasi. fmt.Println mencetak map dengan kunci terurut: map[offline:1 online:2].

type Server struct {
Nama string
IP string
Online bool
}
web := Server{Nama: "web", IP: "10.10.10.2", Online: true}
fmt.Println(web.Nama) // web
web.Online = false

Field yang diawali huruf besar bisa diakses dari paket lain (exported); huruf kecil hanya di paket yang sama. Aturan ini berlaku juga untuk fungsi dan tipe.

Method adalah fungsi yang menempel pada sebuah tipe. Tipe pemiliknya (receiver) ditulis sebelum nama:

func (s Server) Status() string {
if s.Online {
return "online"
}
return "offline"
}
fmt.Println(web.Status())

Receiver biasa menerima salinan. Untuk mengubah isi struct aslinya, pakai pointer (*):

func (s *Server) Matikan() {
s.Online = false
}
servers[0].Matikan() // servers[0] benar-benar berubah
Lab: Inventaris server: struct & map
Misi 0/5
  1. Masuk ke inventaris lalu jalankan programnya.
    Petunjukcd inventaris && go run .
  2. Tambahkan server vps (IP 10.10.10.1, online) dengan append. Jumlahnya jadi 3.
    Petunjukservers = append(servers, Server{Nama: "vps", IP: "10.10.10.1", Online: true})
  3. Buat method func (s Server) Status() string lalu cetak statusnya di loop: db 10.10.10.3 offline.
    Petunjukfunc (s Server) Status() string { if s.Online { return "online" }; return "offline" } — lalu fmt.Println(s.Nama, s.IP, s.Status())
  4. Hitung jumlah server per status dengan map[string]int, lalu cetak map-nya.
    Petunjukhitung := map[string]int{} ; di loop: hitung[s.Status()]++ ; setelah loop: fmt.Println(hitung)
  5. Buat method pointer func (s *Server) Matikan(), panggil untuk server pertama sebelum loop. web harus jadi offline.
    Petunjukfunc (s *Server) Matikan() { s.Online = false } — lalu servers[0].Matikan() sebelum for