Mendalami Struct dan Interface di Golang: Membuat Program yang Lebih Modular
Golang dikenal dengan sintaks yang sederhana namun kuat untuk membangun aplikasi modular. Dua konsep utama yang mendukung hal ini adalah Struct dan Interface. Artikel ini akan membahas bagaimana Anda dapat menggunakan keduanya untuk meningkatkan modularitas dan fleksibilitas kode.
1. Apa Itu Struct?
Struct adalah tipe data komposit di Golang yang memungkinkan Anda untuk mengelompokkan berbagai data dalam satu kesatuan. Struct sering digunakan untuk merepresentasikan entitas dalam program Anda.
Contoh Struct:
package main
import "fmt"
type Person struct {
Name string
Age int
Email string
}
func main() {
// Membuat instance struct
person := Person{
Name: "John Doe",
Age: 30,
Email: "[email protected]",
}
fmt.Println("Name:", person.Name)
fmt.Println("Age:", person.Age)
fmt.Println("Email:", person.Email)
}
Output:
Name: John Doe
Age: 30
Email: [email protected]
2. Menggunakan Method pada Struct
Anda dapat menambahkan fungsi yang melekat pada struct untuk mengatur atau memanipulasi datanya. Fungsi ini disebut method.
Contoh Method:
type Person struct {
Name string
Age int
}
// Method untuk memeriksa apakah seseorang sudah dewasa
func (p Person) IsAdult() bool {
return p.Age >= 18
}
func main() {
person := Person{Name: "Alice", Age: 20}
fmt.Println("Is adult?", person.IsAdult())
}
3. Apa Itu Interface?
Interface adalah kontrak yang mendefinisikan kumpulan metode yang harus diimplementasikan oleh tipe lain. Ini memungkinkan Anda untuk membuat program yang fleksibel dan mendukung polimorfisme.
Contoh Interface:
type Shape interface {
Area() float64
}
type Circle struct {
Radius float64
}
type Rectangle struct {
Width, Height float64
}
// Implementasi metode Area untuk Circle
func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius
}
// Implementasi metode Area untuk Rectangle
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func main() {
var s Shape
s = Circle{Radius: 5}
fmt.Println("Circle Area:", s.Area())
s = Rectangle{Width: 4, Height: 6}
fmt.Println("Rectangle Area:", s.Area())
}
Output:
Circle Area: 78.5
Rectangle Area: 24
4. Memanfaatkan Embedded Struct
Anda dapat membuat struct yang “mengandung” struct lain untuk menyusun data secara hierarkis. Ini dikenal sebagai embedded struct.
Contoh:
type Address struct {
City string
State string
}
type Person struct {
Name string
Age int
Address // Embedded struct
}
func main() {
person := Person{
Name: "Bob",
Age: 35,
Address: Address{City: "Jakarta", State: "DKI Jakarta"},
}
fmt.Println("City:", person.City) // Akses langsung karena embedding
}
5. Membuat Program Modular dengan Struct dan Interface
Menggabungkan Struct dan Interface memungkinkan Anda untuk menulis kode yang lebih modular dan dapat diperluas.
Contoh Program Modular:
package main
import "fmt"
type PaymentProcessor interface {
ProcessPayment(amount float64)
}
type PayPal struct {
Email string
}
type CreditCard struct {
CardNumber string
}
// Implementasi interface untuk PayPal
func (p PayPal) ProcessPayment(amount float64) {
fmt.Printf("Processing PayPal payment of $%.2f for %s\n", amount, p.Email)
}
// Implementasi interface untuk CreditCard
func (cc CreditCard) ProcessPayment(amount float64) {
fmt.Printf("Processing Credit Card payment of $%.2f for card %s\n", amount, cc.CardNumber)
}
func main() {
var processor PaymentProcessor
processor = PayPal{Email: "[email protected]"}
processor.ProcessPayment(100.0)
processor = CreditCard{CardNumber: "1234-5678-9101"}
processor.ProcessPayment(200.0)
}
Output:
Processing PayPal payment of $100.00 for [email protected]
Processing Credit Card payment of $200.00 for card 1234-5678-9101
Kesimpulan
- Struct membantu mengelola data secara terstruktur.
- Interface memungkinkan program untuk lebih fleksibel dan mengikuti prinsip polimorfisme.
- Kombinasi keduanya mendukung pengembangan aplikasi yang modular dan scalable.
Dengan memahami dan menguasai Struct dan Interface, Anda dapat menulis kode Go yang lebih elegan, terorganisir, dan mudah dikelola.