Sebuah program sering perlu menggambarkan satu entitas utuh: sebuah karya punya judul, tahun terbit, penulis, dan daftar bait. Menyimpan data semacam itu dalam variabel-variabel lepas membuat kode cepat kacau: parameter fungsi membengkak dan hubungan antar data hilang. Go tidak menyediakan class seperti Java atau C++; sebagai gantinya, Go menyediakan struct, tipe komposit yang merangkai beberapa nilai bertipe berbeda menjadi satu nilai utuh bernama. Pada chapter ini kita akan mendeklarasikan struct, mengakses field-nya, menyusun struct di dalam struct, lalu mencetak isi struct dengan verb %v dan %+v.

Mendeklarasikan Struct #

Deklarasi struct dimulai dengan kata kunci type, diikuti nama tipe, kata kunci struct, lalu daftar field dalam kurung kurawal. Setiap field ditulis sebagai pasangan nama field dan tipe. Berikut deklarasi struct Sajak yang akan kita pakai sepanjang contoh:

go
type Sajak struct {
        Judul     string
        Tahun     int
        Pengarang Penyair
        Bait      []string
}

Struct Sajak merangkai empat data: Judul bertipe string, Tahun bertipe int, Pengarang bertipe Penyair (struct lain), dan Bait bertipe slice []string. Tanda koma tidak diperlukan di akhir baris field — Go memisahkan field berdasarkan baris. Badan struct hanya berisi data; deklarasi method tidak boleh ditulis di dalam badan struct seperti pada class.

Field dan Cara Mengaksesnya #

Setiap field diakses memakai operator titik: karya.Judul membaca field Judul dari variabel karya. Field bisa diisi ulang lewat assignment biasa, dan field bertipe slice bisa di-append seperti slice biasa. Untuk field bertipe struct lain, aksesnya dirangkai: karya.Pengarang.Nama masuk ke field Pengarang lalu membaca field Nama di dalamnya.

Struct di Dalam Struct #

Struct Penyair berikut menjadi field Pengarang pada Sajak:

go
type Penyair struct {
        Nama string
        Asal string
}

Pola bersarang ini membuat tipe tetap kecil dan dapat dipakai ulang: struct Penyair bisa dipakai tipe lain, misalnya Buku atau Artikel, tanpa menyalin definisi field. Menyusun tipe dari tipe-tipe kecil adalah fondasi komposisi di Go, yang kita perdalam pada chapter Embedded Struct .

Program Utuh #

Berkas struct-demo.go menggabungkan seluruh konsep di atas dalam satu program yang dapat dijalankan. Jalankan dari direktori chapter:

bash
go run struct-demo.go
go
package main

import "fmt"

type Penyair struct {
	Nama string
	Asal string
}

type Sajak struct {
	Judul     string
	Tahun     int
	Pengarang Penyair
	Bait      []string
}

func main() {
	var karya Sajak
	fmt.Printf("%v\n", karya)

	karya = Sajak{
		Judul:     "Pantun Kepada Rakyat",
		Tahun:     1938,
		Pengarang: Penyair{Nama: "Chairil Anwar", Asal: "Medan"},
		Bait: []string{
			"Kalau sampai waktuku",
			"ku mau tak seorang 'kan merayu",
		},
	}

	fmt.Printf("%v\n", karya)
	fmt.Printf("%+v\n", karya)
	fmt.Println(karya.Pengarang.Nama, "menulis", karya.Judul, "pada", karya.Tahun)

	karya.Bait = append(karya.Bait, "tapi kekal tinggal beberapa pantun")
	fmt.Println("jumlah bait:", len(karya.Bait))

	penanda := struct {
		Jenis string
		Urut  int
	}{Jenis: "catatan kaki", Urut: 1}
	fmt.Printf("%+v\n", penanda)
}

Output yang Dihasilkan:

text
{ 0 { } []}
{Pantun Kepada Rakyat 1938 {Chairil Anwar Medan} [Kalau sampai waktuku ku mau tak seorang 'kan merayu]}
{Judul:Pantun Kepada Rakyat Tahun:1938 Pengarang:{Nama:Chairil Anwar Asal:Medan} Bait:[Kalau sampai waktuku ku mau tak seorang 'kan merayu]}
Chairil Anwar menulis Pantun Kepada Rakyat pada 1938
jumlah bait: 3
{Jenis:catatan kaki Urut:1}

Mari kita telaah baris demi baris program di atas:

  1. Baris 5–8 (type Penyair struct ...): mendeklarasikan struct kecil Penyair berisi dua field string; struct ini menjadi field Pengarang pada Sajak.
  2. Baris 10–15 (type Sajak struct ...): mendeklarasikan struct utama dengan empat field bertipe berbeda — string, int, struct Penyair, dan slice []string.
  3. Baris 18–19 (var karya Sajak): mendeklarasikan karya tanpa nilai awal sehingga berisi zero value struct; %v mencetaknya sebagai { 0 { } []}.
  4. Baris 21–29 (karya = Sajak{...}): mengisi karya dengan struct literal; field Pengarang diisi literal bersarang Penyair{...} dan Bait diisi slice literal.
  5. Baris 31–32 (fmt.Printf dua verb): mencetak struct yang sama dengan %v (ringkas) dan %+v (menyertakan nama field).
  6. Baris 33 (karya.Pengarang.Nama): mengakses field bersarang dua tingkat dengan operator titik.
  7. Baris 35–36 (append dan len): menambah satu bait ke field Bait, lalu membaca panjangnya — field slice diperlakukan seperti slice biasa.
  8. Baris 38–41 (penanda := struct{...}{...}): mendeklarasikan struct anonim sekaligus mengisinya; tipenya tidak bernama dan hanya hidup di dalam main.

Mencetak Struct dengan %v dan %+v #

Verb %v mencetak struct dalam bentuk ringkas {nilai1 nilai2 ...} mengikuti urutan field, sedangkan %+v menyertakan nama setiap field. Ketika struct punya banyak field, bentuk %+v jauh lebih mudah dibaca. Go juga menyediakan %#v yang mencetak struct dalam sintaks Go — berguna saat hasil cetakan ingin disalin kembali ke kode.

Struct Anonim #

Struct anonim dideklarasikan tanpa nama, langsung di tempat nilai dibuat, seperti variabel penanda pada program di atas. Pola ini cocok untuk data sekali pakai, misalnya tabel pengujian kecil. Untuk data yang dipakai di banyak tempat, struct bernama tetap pilihan utama karena tipenya bisa dirujuk dan diberi method.

Struct Bukan Class #

Nilai struct yang baru dideklarasikan selalu berisi zero value yang terdefinisi baik — bukan null. Zero value, perbandingan antar struct, dan struct kosong struct{} kita bedah pada chapter berikutnya.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

struct-demo.go

Unduh berkas
go
package main

import "fmt"

type Penyair struct {
	Nama string
	Asal string
}

type Sajak struct {
	Judul     string
	Tahun     int
	Pengarang Penyair
	Bait      []string
}

func main() {
	var karya Sajak
	fmt.Printf("%v\n", karya)

	karya = Sajak{
		Judul:     "Pantun Kepada Rakyat",
		Tahun:     1938,
		Pengarang: Penyair{Nama: "Chairil Anwar", Asal: "Medan"},
		Bait: []string{
			"Kalau sampai waktuku",
			"ku mau tak seorang 'kan merayu",
		},
	}

	fmt.Printf("%v\n", karya)
	fmt.Printf("%+v\n", karya)
	fmt.Println(karya.Pengarang.Nama, "menulis", karya.Judul, "pada", karya.Tahun)

	karya.Bait = append(karya.Bait, "tapi kekal tinggal beberapa pantun")
	fmt.Println("jumlah bait:", len(karya.Bait))

	penanda := struct {
		Jenis string
		Urut  int
	}{Jenis: "catatan kaki", Urut: 1}
	fmt.Printf("%+v\n", penanda)
}