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
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
// 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 structAkses lapangan
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.
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
// 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):
a := Person{Name: "Ada", Age: 36}
b := Person{Name: "Ada", Age: 36}
fmt.Println(a == b) // trueIni juga memungkinkan Anda menggunakannya sebagai kunci peta.
Cobalah
Tentukan tipe Person dengan string Nama dan int Usia, lalu buat instance sebagai {Name: 'Ada', Age: 36} di main.
Tunjukkan petunjuk
Sintaks: `ketik Nama struct { Tipe Bidang; ... }`.
Solusi tersedia setelah 3 upaya
Cetak nilai bidang Nama p (Orang yang sudah ada).
Tunjukkan petunjuk
Akses lapangan: `p.Field`.
Solusi tersedia setelah 3 upaya
Apa visibilitas bidang 'string nama' (huruf kecil) dari paket lain?
// in package other
type X struct {
name string
}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{...}dannew(T)untuk penunjuk; dereferensi implisit (p.Fieldpada*T).- Huruf besar = diekspor; huruf kecil = pribadi untuk paket.
- Struktur sebanding dengan
==jika semua bidang sebanding; dapat digunakan sebagai kunci peta.