Structs

Struct adalah tipe data yang menggabungkan beberapa field dengan tipe data yang berbeda.

Contoh Masalah

Bagaimana cara:

  1. Membuat tipe data kompleks
  2. Mengelompokkan data yang berhubungan
  3. Membuat object-like data structure

Penyelesaian

package main

import (
    "fmt"
    "time"
)

// 1. Definisi struct dasar
type Person struct {
    FirstName string
    LastName  string
    Age       int
}

// 2. Struct dengan embedded struct
type Address struct {
    Street  string
    City    string
    Country string
}

type Employee struct {
    Person    // Embedded struct
    Address   // Embedded struct
    JobTitle  string
    HireDate  time.Time
}

// 3. Method untuk struct
func (p Person) FullName() string {
    return fmt.Sprintf("%s %s", p.FirstName, p.LastName)
}

func (p *Person) Birthday() {
    p.Age++
}

// 4. Constructor-like function
func NewEmployee(firstName, lastName string, age int, 
    jobTitle string) *Employee {
    return &Employee{
        Person: Person{
            FirstName: firstName,
            LastName:  lastName,
            Age:       age,
        },
        JobTitle: jobTitle,
        HireDate: time.Now(),
    }
}

func main() {
    // Contoh 1: Membuat dan menggunakan struct
    person := Person{
        FirstName: "John",
        LastName:  "Doe",
        Age:       30,
    }
    
    fmt.Printf("Person: %+v\n", person)
    fmt.Printf("Full Name: %s\n", person.FullName())

    // Contoh 2: Pointer ke struct
    person.Birthday()
    fmt.Printf("\nSetelah ulang tahun: %+v\n", person)

    // Contoh 3: Struct literal dengan field names
    addr := Address{
        Street:  "Jalan Merdeka 123",
        City:    "Jakarta",
        Country: "Indonesia",
    }

    // Contoh 4: Struct dengan embedded struct
    emp := Employee{
        Person: Person{
            FirstName: "Jane",
            LastName:  "Smith",
            Age:       25,
        },
        Address:  addr,
        JobTitle: "Software Engineer",
        HireDate: time.Now(),
    }

    fmt.Printf("\nEmployee: %+v\n", emp)
    fmt.Printf("Employee Name: %s\n", emp.FullName())
    fmt.Printf("Employee City: %s\n", emp.City) // Promoted field

    // Contoh 5: Menggunakan constructor
    newEmp := NewEmployee("Bob", "Johnson", 35, "Manager")
    fmt.Printf("\nNew Employee: %+v\n", newEmp)

    // Contoh 6: Anonymous struct
    point := struct {
        X, Y int
    }{
        X: 10,
        Y: 20,
    }
    
    fmt.Printf("\nPoint: %+v\n", point)

    // Contoh 7: Slice of structs
    people := []Person{
        {FirstName: "Alice", LastName: "Brown", Age: 28},
        {FirstName: "Charlie", LastName: "Davis", Age: 32},
    }

    fmt.Printf("\nPeople:\n")
    for _, p := range people {
        fmt.Printf("- %s (%d years)\n", p.FullName(), p.Age)
    }
}

Penjelasan Kode

  1. Definisi Struct

    • Kumpulan field
    • Tipe data berbeda
    • Nama field unik
  2. Method

    • Function dengan receiver
    • Value vs pointer receiver
    • Mengakses field struct
  3. Embedded Struct

    • Composition over inheritance
    • Field promotion
    • Reuse struktur

Output

Person: {FirstName:John LastName:Doe Age:30}
Full Name: John Doe

Setelah ulang tahun: {FirstName:John LastName:Doe Age:31}

Employee: {Person:{FirstName:Jane LastName:Smith Age:25} Address:{Street:Jalan Merdeka 123 City:Jakarta Country:Indonesia} JobTitle:Software Engineer HireDate:2024-01-21 11:57:22.123456789 +0700 WIB}
Employee Name: Jane Smith
Employee City: Jakarta

New Employee: &{Person:{FirstName:Bob LastName:Johnson Age:35} Address:{Street: City: Country:} JobTitle:Manager HireDate:2024-01-21 11:57:22.123456789 +0700 WIB}

Point: {X:10 Y:20}

People:
- Alice Brown (28 years)
- Charlie Davis (32 years)

Tips

  • Gunakan struct untuk data yang berhubungan
  • Pilih value vs pointer receiver dengan tepat
  • Manfaatkan embedded struct untuk reuse
  • Buat constructor untuk inisialisasi kompleks
  • Dokumentasikan field dan method