Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 ContactInfo dengan field OwnerName dan Phone (keduanya bertipe string)
    • Struct Vehicle yang meng-embed ContactInfo (tanpa nama field) dan menambahkan field Make, Model, dan Year
    Buat juga method bernama Summary pada Vehicle yang mengembalikan string berformat berisi semua informasi kendaraan dan kontak.
  • main.go: Baca detail kendaraan dan pemilik dari input, buat instance Vehicle dengan ContactInfo yang 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:

  1. Nama pemilik yang diakses langsung pada Vehicle (misalnya, v.OwnerName)
  2. Nomor telepon yang diakses melalui tipe yang di-embed (misalnya, v.ContactInfo.Phone)
  3. 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-1234

Perhatikan 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
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Go online