Structs
Struct adalah tipe data yang menggabungkan beberapa field dengan tipe data yang berbeda.
Contoh Masalah
Bagaimana cara:
- Membuat tipe data kompleks
- Mengelompokkan data yang berhubungan
- 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
Definisi Struct
- Kumpulan field
- Tipe data berbeda
- Nama field unik
Method
- Function dengan receiver
- Value vs pointer receiver
- Mengakses field struct
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