Struct Bersarang
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 16 dari 107.
struct bertingkat adalah struct yang berisi struct bernama lain sebagai salah satu field-nya. Ini memungkinkan kamu memodelkan data yang kompleks dan hierarkis dengan menyusun tipe yang lebih kecil dan dapat digunakan kembali.
type Address struct {
Street string
City string
ZIP string
}
type Person struct {
Name string
Age int
Address Address // struct bersarang
}Untuk mengakses field dalam struct bertingkat, rangkai nama field dengan titik.
p := Person{
Name: "Alice",
Age: 30,
Address: Address{
Street: "123 Main St",
City: "Boston",
ZIP: "02101",
},
}
fmt.Println(p.Address.City) // BostonPenumpukan mendukung penggunaan ulang kode. Tipe Address dapat digunakan di beberapa struct seperti Person, Company, atau Order tanpa menduplikasi field. Pendekatan ini mencerminkan hubungan di dunia nyata, ketika entitas berisi entitas lain.
type Company struct {
Name string
Employees int
Address Address // tipe Address yang sama digunakan kembali
}Kamu dapat menyusun struct secara bertingkat hingga beberapa level, tetapi hierarki yang dangkal meningkatkan keterbacaan. Struct bersarang merupakan hal mendasar untuk membangun model data berorientasi objek di Go.
Tantangan
MudahMari kita buat sistem manajemen karyawan yang menunjukkan bagaimana struct bertingkat membantu memodelkan hierarki di dunia nyata. Kamu akan membuat struktur tempat karyawan menjadi bagian dari departemen, dan departemen memiliki informasi lokasi.
Kamu akan menyusun kodemu dalam dua file:
models.go: Definisikan tiga struct yang bekerja sama:Locationdengan fieldBuilding(string) danFloor(int)DepartmentdenganName(string) dan fieldLocationbertingkatEmployeedenganID(int),Name(string), dan fieldDepartmentbertingkat
main.go: Baca informasi karyawan dari input, buat Employee dengan struct bertingkat yang tepat, lalu tampilkan profil karyawan lengkap dengan mengakses field melalui struktur bertingkat.
Input berikut akan diberikan:
- Baris 1: ID karyawan (bilangan bulat)
- Baris 2: Nama karyawan
- Baris 3: Nama departemen
- Baris 4: Nama gedung
- Baris 5: Nomor lantai (bilangan bulat)
Format output:
Employee: [Name] (ID: [ID])
Department: [DepartmentName]
Location: [Building], Floor [Floor]Contohnya, jika inputnya adalah 101, Alice, Engineering, Tower, dan 5, outputmu seharusnya:
Employee: Alice (ID: 101)
Department: Engineering
Location: Tower, Floor 5Akses field bertingkat menggunakan notasi titik untuk menelusuri hierarki struct (misalnya, employee.Department.Location.Building).
Coba sendiri
package main
import "fmt"
func main() {
// Baca informasi karyawan
var id int
var name string
var deptName string
var building string
var floor int
fmt.Scanln(&id)
fmt.Scanln(&name)
fmt.Scanln(&deptName)
fmt.Scanln(&building)
fmt.Scanln(&floor)
// TODO: Buat Employee dengan struct bersarang yang tepat
// Gunakan struct Location, Department, dan Employee dari models.go
// Inisialisasi semua field bersarang dengan nilai input
// TODO: Tampilkan profil karyawan dengan format berikut:
// Employee: [Name] (ID: [ID])
// Department: [DepartmentName]
// Location: [Building], Floor [Floor]
// Akses field bersarang menggunakan notasi titik (misalnya, employee.Department.Location.Building)
}
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