← Kembali ke kursus
Pelajaran kursus · Go
Pelajaran 19

Struct

Cetakan data yang mengelompokkan nilai bertipe berbeda.

Pahami konsepnya

Struct mengelompokkan beberapa nilai bertipe berbeda di bawah satu nama — cetakan data untuk entitas nyata seperti siswa, produk, atau pesanan. Definisikan dengan type Nama struct, buat nilainya dengan Nama{field: nilai}, dan akses isinya dengan tanda titik.

Bentuk-bentuk pendukung: struct anonim untuk data sekali pakai, struct bersarang (field berupa struct lain), dan embedded struct — menuliskan tipe tanpa nama field menjadikannya "menyatu", sehingga field serta method-nya bisa diakses langsung dari luar. Inilah cara Go menggantikan pewarisan (inheritance): komposisi, bukan hirarki.

Struct adalah nilai: penugasan dan pengiriman ke fungsi menyalin isinya. Karena itu struct besar biasa dilewatkan sebagai pointer. Saat dicetak dengan %v, seluruh field tampil; format %+v menambahkan nama fieldnya.

Coba contoh kode

package main

import "fmt"

type Alamat struct {
    Kota   string
    KodePos string
}

type Siswa struct {
    Nama  string
    Poin  int
    Tinggal Alamat
}

func main() {
    ari := Siswa{Nama: "Ari", Poin: 10, Tinggal: Alamat{Kota: "Bandung", KodePos: "40115"}}
    fmt.Printf("%+v\n", ari)
}

Struct bersarang: field Tinggal berupa struct Alamat, diakses berantai ari.Tinggal.Kota. %+v mencetak semua field beserta namanya — sangat berguna untuk melihat isi struct saat debugging.

Embedded struct

type Pengguna struct {
    Email string
}

type Admin struct {
    Pengguna          // embedded: tanpa nama field
    Level   int
}

func main() {
    a := Admin{Pengguna: Pengguna{Email: "ops@site.dev"}, Level: 5}
    fmt.Println(a.Email) // akses langsung, bukan a.Pengguna.Email
}

Karena Pengguna ditanam tanpa nama field, isinya "menyatu" dengan Admin — a.Email bekerja seolah field itu milik Admin sendiri. Method pada tipe yang ditanam juga ikut terwariskan; inilah komposisi ala Go.

Struct anonim

func main() {
    hasil := struct {
        Nama string
        Skor int
    }{Nama: "Ari", Skor: 95}
    fmt.Println(hasil.Nama, hasil.Skor)
}

Struct anonim dideklarasikan dan diisi dalam satu langkah — pas untuk data sementara yang tidak akan dipakai ulang, misalnya bentuk respons sekali cetak. Untuk data yang muncul berkali-kali, selalu definisikan tipe bernama.

Latihan singkat

Uji: tanam Pemasok ke dalam Produk lalu cetak — program harus mencetak persis `Kopi dari PT Jaya`.