Dasar Penyematan Struct
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 35 dari 107.
Penyematan struct adalah mekanisme Go untuk menyertakan satu tipe struct di dalam struct lain. Kamu cukup menentukan tipenya, bukan menggunakan nama field, lalu Go mempromosikan field struct yang disematkan ke struct luar.
Berikut sintaks dasarnya:
type Address struct {
City string
Country string
}
type Person struct {
Name string
Address // tertanam, tanpa nama field
}
Saat kamu menyematkan Address ke dalam Person, kamu dapat mengakses field yang disematkan secara langsung pada struct luar:
func main() {
p := Person{
Name: "Alice",
Address: Address{
City: "London",
Country: "UK",
},
}
fmt.Println(p.City) // London, akses langsung
fmt.Println(p.Country) // UK, akses langsung
fmt.Println(p.Address.City) // juga bisa
}
Perhatikan bahwa p.City berfungsi tanpa harus menulis p.Address.City secara eksplisit. Go otomatis mempromosikan field dari struct yang disematkan, sehingga field tersebut dapat diakses seolah-olah menjadi milik struct luar. Jika perlu, kamu tetap dapat mengaksesnya melalui nama tipe yang disematkan.
Ini berbeda dari struct bersarang biasa, yang mengharuskan kamu selalu menggunakan nama field untuk mengakses field di dalamnya. Embedding membuat API yang lebih datar dan praktis, sambil tetap mempertahankan pengelompokan logis untuk data yang terkait.
Tantangan
MudahMari buat sistem registrasi kendaraan yang menggunakan embedding struct untuk membuat model data yang rapi dan terorganisasi. Kamu akan memisahkan informasi kontak dari detail kendaraan, sambil tetap memungkinkan akses langsung ke semua field melalui embedding.
Kamu akan mengatur kodemu dalam dua file:
vehicle.go: Buat dua struct yang bekerja bersama melalui embedding:- Struct
ContactInfodengan fieldOwnerNamedanPhone(keduanya bertipe string) - Struct
Vehicleyang meng-embedContactInfo(tanpa nama field) dan menambahkan fieldMake,Model, danYear
SummarypadaVehicleyang mengembalikan string berformat berisi semua informasi kendaraan dan kontak.- Struct
main.go: Baca detail kendaraan dan pemilik dari input, buat instanceVehicledenganContactInfoyang di-embed, lalu tunjukkan cara mengakses field yang di-embed secara langsung dan melalui nama tipe yang di-embed. Cetak ringkasan kendaraan di akhir.
Input berikut akan diberikan:
- Baris 1: Nama pemilik
- Baris 2: Nomor telepon
- Baris 3: Merek kendaraan
- Baris 4: Model kendaraan
- Baris 5: Tahun (bilangan bulat)
Method Summary-mu harus mengembalikan string dengan format berikut:
[Year] [Make] [Model] - Owner: [OwnerName], Phone: [Phone]Dalam file utamamu, tunjukkan field promotion dengan mencetak:
- Nama pemilik yang diakses langsung pada Vehicle (misalnya,
v.OwnerName) - Nomor telepon yang diakses melalui tipe yang di-embed (misalnya,
v.ContactInfo.Phone) - Ringkasan lengkap dari method
Summary-mu
Misalnya, jika diberikan Alice Smith, 555-1234, Toyota, Camry, dan 2023, output-mu seharusnya:
Alice Smith
555-1234
2023 Toyota Camry - Owner: Alice Smith, Phone: 555-1234Perhatikan bahwa kedua pola akses berfungsi, yaitu akses langsung melalui field promotion dan akses eksplisit melalui nama tipe yang di-embed. Ini memberimu fleksibilitas saat bekerja dengan data yang di-embed.
Coba sendiri
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Baca nama pemilik
ownerName, _ := reader.ReadString('\n')
ownerName = strings.TrimSpace(ownerName)
// Baca nomor telepon
phone, _ := reader.ReadString('\n')
phone = strings.TrimSpace(phone)
// Baca merek kendaraan
make, _ := reader.ReadString('\n')
make = strings.TrimSpace(make)
// Baca model kendaraan
model, _ := reader.ReadString('\n')
model = strings.TrimSpace(model)
// Baca tahun
yearStr, _ := reader.ReadString('\n')
yearStr = strings.TrimSpace(yearStr)
year, _ := strconv.Atoi(yearStr)
// TODO: Buat instance Vehicle dengan ContactInfo yang disematkan
// Gunakan nilai yang dibaca dari input di atas
// TODO: Tampilkan nama pemilik yang diakses langsung melalui Vehicle (promosi field)
// Contoh: fmt.Println(v.OwnerName)
// TODO: Tampilkan nomor telepon yang diakses melalui nama tipe yang disematkan
// Contoh: fmt.Println(v.ContactInfo.Phone)
// TODO: Tampilkan ringkasan lengkap menggunakan method Summary
// Contoh: fmt.Println(v.Summary())
// Hapus baris-baris ini setelah kamu menerapkan solusi
_ = ownerName
_ = phone
_ = make
_ = model
_ = year
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP di Go
File EksternalWorkspace Go dan modulePaket dan ImporNama yang Diekspor dan Tidak DieksporPengantar OOP di Gostruct sebagai classMendefinisikan method pada structPointer receiver vs value receiverInisialisasi structFungsi KonstruktorUlasan: Kalkulator Sederhana4Interface
Pengenalan InterfaceImplementasi ImplisitInterface sebagai KontrakInterface Kosong (any)Type AssertionType SwitchKomposisi InterfaceInterface Stringer & ErrorUlasan: Kalkulator Bentuk7Enkapsulasi
Field yang Diekspor vs Tidak DieksporEnkapsulasi Tingkat PackageMethod Getter dan SetterPenyembunyian Informasi di GoRingkasan: Data Siswa10Generics (Go 1.18+)
Pengantar GenericsParameter TipeBatasan TipeStruct GenerikCara Alternatif untuk Method GenerikRingkasan Koleksi Generik2Mendalami Tipe dan Struct
Tipe Dasar dan KompositDefinisi Tipe KustomTag StructStruct AnonimStruct BersarangNilai Nol dan Nilai BawaanRangkuman: Buku Kontak5Komposisi daripada Pewarisan
Mengapa Go Tidak Memiliki PewarisanDasar Penyematan StructPromosi methodMenyematkan Beberapa StructPenyematan vs AgregasiMembayangi method yang DisematkanRangkuman: Hierarki Karyawan8Penanganan Error & OOP
Interface errorTipe Error KustomPembungkusan Error (fmt.Errorf)Error Sentinelerrors.Is() dan errors.As()Panic, Defer, dan RecoverRangkuman: Parser File3Pointer dan Memori
Dasar-Dasar Pointer di GoPointer ke StructPass by Value vs ReferenceFungsi new()Garbage Collection di GoRekap: Pembuat Linked List6Polimorfisme di Go
Polimorfisme melalui InterfaceDuck Typing di GoAturan Pemenuhan InterfaceKoleksi PolimorfikInjeksi DependensiRangkuman: Pemroses Pembayaran9Konkruensi & OOP
Dasar-dasar GoroutineChannel & KomunikasiChannel Ber-buffer vs Tanpa BufferPernyataan selectsync.Mutex & sync.RWMutexsync.WaitGroupDesain Struct yang Aman untuk ThreadRingkasan: Worker PoolLatihan sendiri: Compiler Go online