0Pricing
Go Academy · Pelajaran

Pointer dan Fungsi

Mengirim berdasarkan nilai dibandingkan mengirim berdasarkan pointer

Pointer dan Fungsi adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 2 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.

Diteruskan berdasarkan Nilai

Go meneruskan semua argumen fungsi berdasarkan nilai—sebuah salinan dibuat. Perubahan di dalam fungsi tidak memengaruhi nilai asli:

package main
import "fmt"

func increment(n int) { n++ }

func main() {
    x := 5
    increment(x)
    fmt.Println(x) // 5 — unchanged
}

Meneruskan melalui Penunjuk

Teruskan penunjuk agar fungsi dapat mengubah nilai asli:

package main
import "fmt"

func increment(n *int) { *n++ }

func main() {
    x := 5
    increment(&x)
    fmt.Println(x) // 6
}

Mengembalikan Penunjuk

Fungsi dapat mengembalikan penunjuk ke nilai yang dialokasikan di heap. Analisis pelolosan Go memastikan keamanannya:

package main
import "fmt"

func newInt(v int) *int { return &v }

func main() {
    p := newInt(42)
    fmt.Println(*p) // 42
}

Efisiensi Struktur Besar

Meneruskan struktur besar melalui penunjuk menghindari penyalinan yang mahal:

package main
import "fmt"

type BigData struct{ Data [1024]int }

func process(d *BigData) { d.Data[0] = 99 }

func main() {
    bd := BigData{}
    process(&bd)
    fmt.Println(bd.Data[0]) // 99
}

Penunjuk ke Antarmuka

Jarang diperlukan — antarmuka sudah menyimpan penunjuk secara internal. Meneruskan *interface{} hampir selalu salah:

package main
import "fmt"

type Stringer interface{ String() string }

func print(s Stringer) { fmt.Println(s.String()) }

// Pass interface directly, NOT *Stringer
type Name string
func (n Name) String() string { return string(n) }

func main() {
    print(Name("Alice"))
}

Parameter Opsional dengan Penunjuk

Gunakan parameter penunjuk untuk membedakan "tidak diberikan" dari nilai nol:

package main
import "fmt"

func greet(name *string) {
    if name == nil {
        fmt.Println("Hello, stranger")
        return
    }
    fmt.Println("Hello,", *name)
}

func main() {
    s := "Alice"
    greet(&s)
    greet(nil)
}

Perubahan melalui Slice

Slice sudah memiliki penunjuk internal, jadi Anda sering kali tidak memerlukan *[]T. Namun, ketika append melakukan realokasi, Anda memerlukan penunjuk ke slice itu sendiri:

package main
import "fmt"

func addItem(s *[]int, v int) { *s = append(*s, v) }

func main() {
    nums := []int{1, 2, 3}
    addItem(&nums, 4)
    fmt.Println(nums) // [1 2 3 4]
}

Pembuatan Alias Penunjuk

Beberapa penunjuk ke variabel yang sama membuat alias — perubahan melalui satu penunjuk terlihat melalui semua penunjuk lainnya:

package main
import "fmt"

func main() {
    x := 10
    a, b := &x, &x
    *a = 99
    fmt.Println(*b) // 99 — same memory
}

Menghindari Penggunaan Penunjuk Berlebihan

Gunakan penunjuk hanya jika diperlukan:

  • Perubahan di dalam fungsi
  • Struktur besar (>= sekitar 64 byte)
  • Nilai nil untuk menyatakan "tidak ada"

Penggunaan penunjuk yang berlebihan menambah tekanan pada GC dan mengurangi kejelasan kode.

Pola Penunjuk Fungsi

Simpan penunjuk fungsi dalam peta untuk tabel pengiriman:

package main
import "fmt"

func add(a, b int) int { return a + b }
func sub(a, b int) int { return a - b }

func main() {
    ops := map[string]func(int,int)int{
        "+": add, "-": sub,
    }
    fmt.Println(ops["+"](10, 3)) // 13
    fmt.Println(ops["-"](10, 3)) // 7
}

Pemeriksaan Singkat

Bagaimana Anda memungkinkan fungsi mengubah variabel bilangan bulat yang didefinisikan oleh pemanggil?

Rangkuman

Hal-hal penting:

  • Go meneruskan argumen berdasarkan nilai — gunakan penunjuk untuk melakukan perubahan
  • Kembalikan penunjuk dari konstruktor untuk alokasi di heap
  • Slice membawa penunjuk internal, tetapi append mungkin memerlukan *[]T
  • Hindari penggunaan penunjuk secara berlebihan — utamakan nilai untuk tipe kecil

Tugas Latihan

Tulis fungsi normalize yang menerima *[]string dan mengubah semua string menjadi huruf kecil secara langsung menggunakan strings.ToLower.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pointer dan Fungsi” gratis?

Ya — teks lengkap “Pointer dan Fungsi” 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 “Pointer dan Fungsi”?

Mengirim berdasarkan nilai dibandingkan mengirim berdasarkan 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 2 dari 4.

Berapa lama pelajaran “Pointer dan Fungsi” 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