Go From Zero to Hero #19: Panduan Lengkap Menggunakan Method di Go-lang untuk Pemrograman Berorientasi Objek

Go From Zero to Hero #19: Panduan Lengkap Menggunakan Method di Go-lang untuk Pemrograman Berorientasi Objek

Table of Contents

Halo Go Developers! Selamat datang kembali di seri Go From Zero to Hero.

Di artikel sebelumnya, kita sudah berhasil mengawinkan Struct dan Map untuk membuat sistem pendataan digital yang rapi. Kita tahu kalau Struct itu keren banget buat mengelompokkan berbagai data (properti/atribut) menjadi satu kesatuan.

Tapi sadar gak, sih? Struct yang kita buat kemarin itu sebenarnya masih “benda mati”. Dia cuma bisa menyimpan data, tapi tidak bisa melakukan aksi apa-apa secara mandiri.

Nah, di artikel kali ini, kita akan belajar cara menghidupkan Struct tersebut menggunakan fitur Go-lang yang bernama Method. Yuk, kita bahas sampai tuntas!


Apa itu Method? (Analogi Dunia Nyata)

Bayangkan sebuah Struct bernama Robot. Struct ini punya atribut seperti Nama (string) dan Baterai (int). Kalau kita cuma pakai struct biasa, robot ini cuma jadi pajangan yang menyimpan data baterai saja.

Agar robot ini bisa melakukan aksi—seperti berjalan, berbicara, atau menembak—kita butuh fungsi khusus yang menempel pada robot tersebut. Di Go-lang, fungsi yang menempel dan menjadi milik suatu Struct itulah yang disebut dengan Method.

Bedanya Fungsi Biasa vs Method:

  • Fungsi Biasa: Bisa dipanggil oleh siapa saja secara bebas secara mandiri.
  • Method: Hanya bisa dipanggil oleh objek/variabel yang dibuat dari Struct pemilik method tersebut.

Sintaks Dasar Method

Cara menulis method mirip dengan fungsi biasa (func), bedanya kita harus menyisipkan sebuah parameter khusus di antara kata kunci func dan nama fungsi tersebut. Parameter ini disebut sebagai Receiver.

Mari kita lihat struktur rumusnya:

func (receiver NamaStruct) NamaMethod() {
    // Kode program di sini
}

Supaya lebih kebayang, mari kita langsung terapkan ke kode program nyata.

package main

import "fmt"

// 1. Kita buat Struct-nya dulu
type Player struct {
	Name  string
	Level int
}

// 2. Kita buat Method yang menempel pada Struct Player
// (p Player) di bawah ini adalah Receiver-nya
func (p Player) Introduce() {
	fmt.Printf("Halo, nama saya %s dan saya level %d!\n", p.Name, p.Level)
}

func main() {
	// 3. Membuat objek dari Struct
	hero := Player{Name: "GopherGamer", Level: 50}

	// 4. Memanggil method menggunakan tanda titik (.)
	hero.Introduce()
}

Coba perhatikan di dalam func main(). Kita memanggil method-nya dengan cara hero.Introduce(). Keren, kan? Struct Player kita sekarang seolah-olah punya “perilaku” atau aksinya sendiri.

Dua Jenis Receiver: Value vs Pointer

Ini adalah bagian paling krusial yang sering bikin bingung pemula di Go-lang. Receiver pada method terbagi menjadi dua jenis:

  1. Value Receiver (Tanpa Tanda Bintang *) Gaya ini adalah yang kita pakai pada contoh di atas (p Player). Sifat dari Value Receiver adalah Read-Only. Method hanya menduplikasi data dari struct asli. Jadi, kalau kamu mengubah isi data struct di dalam method ini, data struct yang asli di main() tidak akan berubah.

  2. Pointer Receiver (Menggunakan Tanda Bintang *) Jika kamu ingin membuat method yang bertugas untuk mengubah atau memanipulasi data di dalam struct asli (misalnya menaikkan level player, mengurangi darah, dll), kamu wajib menggunakan Pointer Receiver (p *Player).

Mari kita lihat perbedaan efeknya lewat kode berikut:

package main

import "fmt"

type Player struct {
	Name  string
	Level int
}

// Menggunakan VALUE RECEIVER (Gak merubah data asli)
func (p Player) NaikLevelSalah() {
	p.Level += 1
}

// Menggunakan POINTER RECEIVER (Merubah data asli)
func (p *Player) NaikLevelBenar() {
	p.Level += 1
}

func main() {
	gamer := Player{Name: "Rookie", Level: 1}

	// Coba pakai method Value Receiver
	gamer.NaikLevelSalah()
	fmt.Println("Setelah LevelSalah:", gamer.Level) // Output tetap 1

	// Coba pakai method Pointer Receiver
	gamer.NaikLevelBenar()
	fmt.Println("Setelah LevelBenar:", gamer.Level) // Output berubah jadi 2
}

Tips 💡

Kapan harus pakai Pointer Receiver (*)?

  • Jika method bertugas untuk mengubah/meng-update nilai data di dalam struct.

  • Jika ukuran data struct sangat besar, agar Go tidak membuang memori untuk menduplikasi/mengopi data tersebut saat method dipanggil.


Kesimpulan & Penutup

Selamat, Karakter Objek Pertama Pemrogramanmu Sudah Lahir! 🧠

Sekarang kamu sudah paham bahwa Method bukanlah hal yang asing atau rumit. Method hanyalah sebuah fungsi biasa yang diberikan “pemilik” (receiver) agar bisa menempel pada Struct tertentu. Dengan menguasai Value Receiver (hanya baca data) dan Pointer Receiver (bisa ubah data asli), kamu sudah memegang kendali penuh dalam membangun objek-objek yang interaktif di Go-lang!

Yuk, Nyicip Eksperimen Kecil! 🛠️

Coba buat sebuah Struct Kucing dengan field Nama (string) dan Energi (int). Buatlah dua buah method:

  1. Makan() yang menggunakan Pointer Receiver untuk menambah nilai Energi sebanyak +10.
  2. Lari() yang menggunakan Value Receiver untuk mencetak kalimat “Kucing sedang lari!”.

Coba panggil method Makan(), lalu cetak nilai Energi kucingmu di terminal. Apakah energinya bertambah?

🎯 Tantangan Untukmu (Challenge!)

Buatlah sebuah program Go dengan Struct RekeningBank yang memiliki field Pemilik (string) dan Saldo (int).

Kemudian buat 2 method:

  • Setor(jumlah int) $\rightarrow$ Menambah nilai saldo sesuai jumlah yang disetor.
  • Tarik(jumlah int) $\rightarrow$ Mengurangi nilai saldo jika saldo mencukupi. Jika saldo tidak cukup, cetak pesan: “Peringatan: Saldo tidak cukup!”.

Contoh Alur:

dompet := RekeningBank{Pemilik: "Budi", Saldo: 100000}
dompet.Setor(50000)  // Saldo jadi 150000
dompet.Tarik(200000) // Cetak pesan peringatan!

Tulis solusi kodenya di kolom komentar di bawah ya! Kalau masih bingung atau kena error, tanyakan saja, kita bedah bareng-bareng.

Bocoran Artikel Selanjutnya 🚀

Setelah kamu mahir mengawinkan data dan aksi menggunakan Struct & Method, kini saatnya kita melangkah ke konsep pemungkas Object-Oriented Programming (OOP) di Go!

Di artikel Go From Zero to Hero #20 selanjutnya, kita akan membedah Interface di Go — Cara Membuat Kode Fleksibel dan Modular. Siapkan diri kamu untuk naik level lagi!

Sampai jumpa di artikel berikutnya, tetap semangat, dan happy coding! 🚀

Tags :
Share :
comments powered by Disqus

Related Posts

Go From Zero to Hero #17: Panduan Lengkap Menggunakan Map dan Manipulasi Key-Value di Golang

Go From Zero to Hero #17: Panduan Lengkap Menggunakan Map dan Manipulasi Key-Value di Golang

Belajar memahami struktur data Map di Golang untuk menyimpan dan memanipulasi data berbentuk Key-Value dengan cepat dan efisien.

Go From Zero to Hero #15: Mengenal Array — Cara Praktis Menyimpan Banyak Data dalam Satu Wadah

Go From Zero to Hero #15: Mengenal Array — Cara Praktis Menyimpan Banyak Data dalam Satu Wadah

Halo Go Developers! Selamat datang kembali di seri Go From Zero to Hero. Di artikel ketujuh kemarin, kita sudah berhasil memberi arahan komputer untuk melakukan tugas berulang-ulang lewat satu-satunya …

Go From Zero to Hero #10: Logika Bertingkat: Menguasai Komposisi Struktur Kontrol (Nested Loop)

Go From Zero to Hero #10: Logika Bertingkat: Menguasai Komposisi Struktur Kontrol (Nested Loop)

Belajar menggabungkan percabangan dan perulangan (Nested Loop & If inside For) di Go-lang untuk memecahkan logika kode program yang kompleks.