← Kembali ke kursus
Pelajaran kursus · Go
Pelajaran 20

Method

Fungsi yang menempel pada tipe.

Pahami konsepnya

Method adalah fungsi yang menempel pada sebuah tipe. Receiver ditulis di antara func dan nama method: func (s *Siswa) Tambah(p int). Receiver seperti parameter pertama yang tidak tertulis — di dalam method, isinya bisa diakses lewat namanya (s).

Receiver nilai (s Siswa) bekerja pada salinan: method bisa membaca semua field tetapi perubahannya tidak menetap. Receiver pointer (s *Siswa) bekerja pada aslinya: field bisa diubah dan struct besar tidak perlu disalin. Aturan praktisnya: mulai dari pointer receiver bila method mengubah data atau structnya besar; konsisten satu gaya dalam satu tipe.

Method membuat kode terbaca seperti kalimat: ari.Tambah(25) atau waktu.Add(jam). String bawaan Go tidak memiliki method ToUpper; gunakan fungsi strings.ToUpper(teks). Ekspresi seperti v.Logika disebut method value: potongan method yang terikat pada nilai tertentu dan bisa diperlakukan sebagai fungsi biasa.

Coba contoh kode

package main

import "fmt"

type Siswa struct {
    Nama string
    Poin int
}

func (s *Siswa) Tambah(p int) {
    s.Poin += p
}

func (s Siswa) Label() string {
    return fmt.Sprintf("%s (%d poin)", s.Nama, s.Poin)
}

func main() {
    ari := Siswa{Nama: "Ari", Poin: 10}
    ari.Tambah(25)
    fmt.Println(ari.Label())
}

Tambah memakai receiver pointer karena mengubah field — kenaikan Poin tersimpan pada ari sendiri. Label memakai receiver nilai karena hanya membaca; hasilnya string baru. Go otomatis mengubah ari.Tambah(25) menjadi (&ari).Tambah(25), jadi pemanggilannya tetap mulus.

Method pada tipe buatan sendiri

type Celcius float64

func (c Celcius) Fahrenheit() float64 {
    return float64(c)*9/5 + 32
}

func (c Celcius) Beku() bool {
    return c <= 0
}

func main() {
    suhu := Celcius(25.5)
    fmt.Println(suhu.Fahrenheit(), suhu.Beku()) // 77.9 false
}

Method tidak hanya untuk struct — tipe apa pun yang kamu definisikan (berbasis float64, string, slice) bisa punya method. Celcius menjadi tipe bernama dengan perilakunya sendiri, membuat kode domain (suhu, mata uang, jarak) terbaca jelas.

Latihan singkat

Uji: tambahkan method Kurang dan Lulus (poin >= 70) — program harus mencetak persis `true`.