defer, Fungsi Anonim & Closure
Pemanggilan yang ditunda dan nilai fungsi
defer, Fungsi Anonim & Closure adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.
defer: Eksekusi Tertunda
defer menjadwalkan pemanggilan fungsi agar dijalankan saat fungsi di sekitarnya mengembalikan hasil—apa pun cara pengembaliannya (normal, kesalahan, panic):
func readFile(path string) {
f, err := os.Open(path)
if err != nil { return }
defer f.Close() // runs when readFile returns
// read from f...
}Urutan Evaluasi defer
Pemanggilan yang ditunda dimasukkan ke dalam tumpukan dan dijalankan dalam urutan LIFO (yang terakhir masuk, yang pertama keluar):
func main() {
defer fmt.Println("third")
defer fmt.Println("second")
defer fmt.Println("first")
// Output: first, second, third
}defer untuk Pembersihan
defer adalah cara idiomatis untuk memastikan sumber daya dilepaskan:
- Panggil Unlock setelah mengunci mutex
- Panggil Close setelah membuka file
- Commit atau batalkan transaksi basis data
- Panggil WaitGroup.Done() setelah WaitGroup.Add()
defer dengan Argumen
Argumen untuk pemanggilan yang ditunda dievaluasi segera saat defer dipanggil, bukan saat pemanggilan tersebut dijalankan:
x := 10
defer fmt.Println(x) // prints 10, not 20
x = 20
fmt.Println(x) // prints 20Fungsi Anonim
Fungsi anonim (literal fungsi) didefinisikan secara langsung tanpa nama:
double := func(n int) int {
return n * 2
}
fmt.Println(double(5)) // 10
// Immediately invoked:
result := func(a, b int) int { return a + b }(3, 4)Closure
Closure adalah fungsi yang menangkap variabel dari scope di sekitarnya:
func makeCounter() func() int {
count := 0
return func() int {
count++
return count
}
}
ctr := makeCounter()
fmt.Println(ctr(), ctr(), ctr()) // 1 2 3Jebakan Penangkapan Closure dalam Perulangan
Closure menangkap variabel berdasarkan referensi—ini merupakan bug umum dalam perulangan goroutine:
for i := 0; i < 3; i++ {
i := i // create a new variable per iteration
go func() { fmt.Println(i) }()
}defer dengan Return Bernama
Fungsi yang ditunda dapat mengubah nilai return bernama—berguna untuk memberi anotasi pada kesalahan:
func doWork() (err error) {
defer func() {
if err != nil {
err = fmt.Errorf("doWork: %w", err)
}
}()
return riskyOp()
}Pola Fungsional dengan Closure
Closure memungkinkan pola fungsional seperti memoization:
func memoize(f func(int) int) func(int) int {
cache := map[int]int{}
return func(n int) int {
if v, ok := cache[n]; ok {
return v
}
v := f(n)
cache[n] = v
return v
}
}Closure sebagai Middleware
Closure merupakan blok pembangun middleware pada server HTTP Go—closure membungkus handler dan menambahkan perilaku di sekelilingnya:
func withLogging(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
log.Printf("%s %s", r.Method, r.URL)
next(w, r)
}
}Pemeriksaan Singkat
Kapan argumen untuk pemanggilan fungsi yang ditunda dievaluasi?
Rangkuman: defer, Closure & Fungsi Anonim
Fitur-fitur ini membuat kode Go lebih ekspresif dan aman:
defermenjamin pembersihan saat fungsi keluar—dalam urutan LIFO- Argumen untuk defer dievaluasi segera
- Fungsi anonim dapat ditetapkan ke variabel atau dipanggil secara langsung
- Closure menangkap variabel di sekitarnya berdasarkan referensi
- Waspadai bug penangkapan variabel perulangan dalam goroutine
Kursus berikutnya: Array, Slice & Map.
Belajar Go dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Pertanyaan yang Sering Diajukan
Apakah pelajaran “defer, Fungsi Anonim & Closure” gratis?
Ya — teks lengkap “defer, Fungsi Anonim & Closure” 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 “defer, Fungsi Anonim & Closure”?
Pemanggilan yang ditunda dan nilai fungsi 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 4 dari 4.
Berapa lama pelajaran “defer, Fungsi Anonim & Closure” 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
- Dasar-Dasar Fungsi dan Signature
- Beberapa Nilai Pengembalian
- Fungsi Variadik
- defer, Fungsi Anonim & Closure