Lompati ke konten utama
Modul 5 · Pelajaran 1 dari 521/50 dalam kursus~12 min
Pelajaran modul (1/5)

Mendefinisikan dan menggunakan struct

struct mengelompokkan bidang bernama ke dalam satu jenis. Ini adalah cara Go membangun "objek" — lebih literal dan langsung daripada kelas, dengan tidak ada warisan dan tidak ada konstruktor bawaan.

Pernyataan

Go
type Person struct {
    Name string
    Age  int
}

type memperkenalkan tipe bernama baru. Bidang ditulis satu per baris, name type. Bidang berturut-turut dari jenis yang sama dapat berbagi deklarasi: X, Y int.

Penciptaan

Go
// with named fields (recommended: robust to reordering)
p := Person{Name: "Ada", Age: 36}

// positional (fragile: depends on declaration order)
q := Person{"Ada", 36}

// zero value: every field at its zero value
var r Person          // r = {Name: "", Age: 0}

// pointer: allocate with & or new
ptr := &Person{Name: "Ada"}
ptr2 := new(Person)   // *Person to a zero-value struct

Akses lapangan

Go
p := Person{Name: "Ada", Age: 36}
fmt.Println(p.Name, p.Age)

p.Age = 37            // mutation (if p is a variable)

Pada sebuah pointer, ptr.Name bekerja secara langsung: Go melakukan dereferensi implisit. Tidak ada -> seperti di C.

Visibilitas: aturan huruf besar

Bidang dengan inisial huruf besar diekspor (terlihat dari yang lain paket); huruf kecil = pribadi untuk paket saat ini.

Go
type User struct {
    Name   string  // exported
    salt   []byte  // private to the package
}

Aturan yang sama berlaku untuk setiap pengenal di Go: tipe, fungsi, variabel, bidang.

Struktur anonim dan bersarang

Go
// anonymous (handy for ad-hoc data)
config := struct {
    Host string
    Port int
}{Host: "localhost", Port: 8080}

// nested
type Address struct {
    Street string
    City   string
}
type Customer struct {
    Name    string
    Address Address
}

Keterbandingan

Dua struct sebanding dengan == jika SEMUA bidangnya sesuai sebanding (tidak ada irisan/peta/fungsi di dalamnya):

Go
a := Person{Name: "Ada", Age: 36}
b := Person{Name: "Ada", Age: 36}
fmt.Println(a == b)   // true

Ini juga memungkinkan Anda menggunakannya sebagai kunci peta.

Cobalah

Latihan#go.m5.l1.e1
Upaya: 0Memuat…

Tentukan tipe Person dengan string Nama dan int Usia, lalu buat instance sebagai {Name: 'Ada', Age: 36} di main.

Memuat editor…
Tunjukkan petunjuk

Sintaks: `ketik Nama struct { Tipe Bidang; ... }`.

Solusi tersedia setelah 3 upaya

Latihan#go.m5.l1.e2
Upaya: 0Memuat…

Cetak nilai bidang Nama p (Orang yang sudah ada).

Memuat editor…
Tunjukkan petunjuk

Akses lapangan: `p.Field`.

Solusi tersedia setelah 3 upaya

Quiz#go.m5.l1.e3
Siap

Apa visibilitas bidang 'string nama' (huruf kecil) dari paket lain?

Go
// in package other
type X struct {
    name string
}
Pilihan jawaban

Rekap

  • type Name struct { ... }: tipe bernama baru dengan bidang bernama.
  • Konstruksi: T{Field: value, ...} (disarankan) atau posisional.
  • Nilai nol: setiap bidang pada tipenya nol.
  • &T{...} dan new(T) untuk penunjuk; dereferensi implisit (p.Field pada *T).
  • Huruf besar = diekspor; huruf kecil = pribadi untuk paket.
  • Struktur sebanding dengan == jika semua bidang sebanding; dapat digunakan sebagai kunci peta.