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
appendmungkin 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.