0Pricing
Go Academy · Pelajaran

Receiver Pointer pada Metode

Mengubah status struct melalui receiver pointer

Receiver Pointer pada Metode adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.

Rangkuman: Penerima Nilai vs Penunjuk

Penerima nilai bekerja pada salinan struktur. Penerima penunjuk bekerja pada struktur asli. Gunakan penerima penunjuk setiap kali metode perlu mengubah keadaan.

Perubahan dengan Penerima Penunjuk

Hanya penerima penunjuk yang dapat mengubah struktur:

package main
import "fmt"

type Stack struct{ items []int }

func (s *Stack) Push(v int) { s.items = append(s.items, v) }
func (s *Stack) Pop() int {
    n := len(s.items) - 1
    v := s.items[n]
    s.items = s.items[:n]
    return v
}

func main() {
    var st Stack
    st.Push(1); st.Push(2)
    fmt.Println(st.Pop()) // 2
}

Aturan Konsistensi

Jika ada metode pada suatu tipe yang memerlukan penerima penunjuk, semua metode harus menggunakan penerima penunjuk. Mencampurkan keduanya menimbulkan masalah dalam pemenuhan antarmuka:

package main
import "fmt"

type Counter struct{ n int }

func (c *Counter) Inc()   { c.n++ }   // pointer
func (c *Counter) Val() int { return c.n } // pointer too

func main() {
    c := &Counter{}
    c.Inc(); c.Inc()
    fmt.Println(c.Val()) // 2
}

Pemenuhan Antarmuka

Metode dengan penerima penunjuk hanya termasuk dalam kumpulan metode *T, bukan T. Hal ini memengaruhi pemenuhan antarmuka:

package main
import "fmt"

type Writer interface{ Write([]byte) }

type File struct{ name string }
func (f *File) Write(b []byte) { fmt.Println(string(b)) }

func main() {
    var w Writer = &File{"out.txt"} // OK
    // var w Writer = File{} — compile error
    w.Write([]byte("hello"))
}

Pengambilan Alamat Otomatis

Go otomatis mengambil alamat saat memanggil metode dengan penerima penunjuk pada nilai yang dapat dialamatkan:

package main
import "fmt"

type Box struct{ V int }
func (b *Box) Double() { b.V *= 2 }

func main() {
    b := Box{5}
    b.Double()          // Go does (&b).Double()
    fmt.Println(b.V)    // 10
}

Nilai yang Tidak Dapat Dialamatkan

Anda tidak dapat memanggil metode dengan penerima penunjuk pada nilai yang tidak dapat dialamatkan (elemen peta, nilai kembalian fungsi yang tidak ditetapkan ke variabel):

package main

type T struct{ V int }
func (t *T) Set(v int) { t.V = v }

func getT() T { return T{} }

func main() {
    var t T
    t.Set(1)       // OK — t is addressable
    // getT().Set(1) — ERROR: cannot take address of getT()
    _ = t
}

Penerima Struktur Besar

Selalu gunakan penerima penunjuk untuk struktur besar agar terhindar dari penyalinan mahal pada setiap pemanggilan metode:

package main

type Image struct{ pixels [1024][1024]uint8 }

// Value receiver copies 1MB per call!
func (img Image) Bad() uint8 { return img.pixels[0][0] }

// Pointer receiver — zero copy
func (img *Image) Good() uint8 { return img.pixels[0][0] }

func main() { _ = Image{} }

Penerima Penunjuk Nil

Metode dengan penerima penunjuk dapat menangani nil dengan baik:

package main
import "fmt"

type List struct{ head *node }
type node struct{ val int; next *node }

func (l *List) Len() int {
    if l == nil { return 0 }
    count := 0
    for n := l.head; n != nil; n = n.next { count++ }
    return count
}

func main() {
    var l *List
    fmt.Println(l.Len()) // 0
}

Penyematan dan Penerima Penunjuk

Saat menyematkan tipe dengan penerima penunjuk, struktur luar juga harus digunakan sebagai penunjuk untuk mendapatkan metode yang dipromosikan:

package main
import "fmt"

type Base struct{ V int }
func (b *Base) Set(v int) { b.V = v }

type Derived struct{ Base }

func main() {
    d := &Derived{}
    d.Set(42)           // promoted pointer-receiver method
    fmt.Println(d.V)    // 42
}

Menyalin Mutex

Jangan pernah menyalin struktur yang berisi sync.Mutex — selalu gunakan penerima penunjuk atau teruskan melalui penunjuk. Menyalin mutex yang terkunci mengakibatkan kebuntuan:

package main
import "sync"

type Safe struct {
    mu sync.Mutex
    v  int
}

// Correct: pointer receiver
func (s *Safe) Set(v int) {
    s.mu.Lock()
    defer s.mu.Unlock()
    s.v = v
}

func main() { _ = Safe{} }

go vet Mendeteksi Kesalahan

Jalankan go vet ./... untuk menemukan kesalahan umum pada penerima penunjuk, seperti menyalin mutex dan kunci. Perintah ini merupakan bagian dari alur pembangunan go build dan pemeriksaan CI.

Pemeriksaan Singkat

Penerima penunjuk termasuk dalam kumpulan metode tipe apa?

Rangkuman

Hal-hal penting:

  • Penerima penunjuk melakukan perubahan; penerima nilai tidak
  • Gunakan jenis penerima yang sama untuk semua metode pada suatu tipe
  • Hanya *T yang memenuhi antarmuka yang memerlukan metode dengan penerima penunjuk
  • Jangan pernah menyalin struktur dengan mutex — gunakan penerima penunjuk

Tugas Latihan

Implementasikan struktur Queue dengan metode Enqueue(int), Dequeue() (int, bool), dan Len() int yang menggunakan penerima penunjuk dan didukung oleh slice []int.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Receiver Pointer pada Metode” gratis?

Ya — teks lengkap “Receiver Pointer pada Metode” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Receiver Pointer pada Metode”?

Mengubah status struct melalui receiver pointer Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Go Academy?

Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Receiver Pointer pada Metode” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?

Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Apa Itu Pointer?
  2. Pointer dan Fungsi
  3. Receiver Pointer pada Metode
  4. new() dan Kapan Menggunakan Pointer
← Kembali ke Go Academy