Go Academy · Pelajaran

defer, Fungsi Anonim & Closure

Pemanggilan yang ditunda dan nilai fungsi

Pelajaran 4 dari 412 langkah

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 20

Fungsi 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 3

Jebakan 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:

  • defer menjamin 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.

Gratis untuk memulai

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

  1. Dasar-Dasar Fungsi dan Signature
  2. Beberapa Nilai Pengembalian
  3. Fungsi Variadik
  4. defer, Fungsi Anonim & Closure
← Kembali ke Go Academy