← Kembali ke kursus
Pelajaran kursus · Go
Pelajaran 17

Closure dan fungsi sebagai parameter

Fungsi yang mengingat lingkungannya dan fungsi sebagai argumen.

Pahami konsepnya

Di Go, fungsi adalah nilai: bisa disimpan ke variabel, dimasukkan ke slice atau map, dikirim sebagai parameter, dan dikembalikan dari fungsi lain. Tipe untuk nilai fungsi ditulis seperti tanda tangan — misalnya func(int) int.

Closure terjadi saat fungsi yang dikembalikan "menangkap" variabel dari lingkungan pembuatnya — variabel itu tetap hidup dan diingat di antara pemanggilan. Inilah cara Go membuat penghitung, akumulator, atau pembangkit nilai tanpa class.

Menerima fungsi sebagai parameter membuat kode jadi fleksibel: satu fungsi filter yang sama bisa menyaring dengan kriteria apa pun yang dikirim pemanggil. Sort pun bekerja begitu — slices.SortFunc menerima fungsi pembanding buatanmu.

Coba contoh kode

package main

import "fmt"

func buatPenghitung() func() int {
    hitung := 0
    return func() int {
        hitung++
        return hitung
    }
}

func main() {
    next := buatPenghitung()
    fmt.Println(next(), next(), next()) // 1 2 3
}

Fungsi anonim yang dikembalikan menutup (close over) variabel hitung — meski buatPenghitung sudah selesai, hitung tetap hidup milik si next. Setiap pemanggilan next() menambah dan mengembalikan nilai yang sama persisten. Buat penghitung kedua dan ia punya hitung sendiri yang terpisah.

Fungsi sebagai parameter

func saring(angka []int, kriteria func(int) bool) []int {
    hasil := []int{}
    for _, n := range angka {
        if kriteria(n) {
            hasil = append(hasil, n)
        }
    }
    return hasil
}

func main() {
    data := []int{3, 8, 1, 9, 4, 6}
    genap := saring(data, func(n int) bool { return n%2 == 0 })
    besar := saring(data, func(n int) bool { return n > 5 })
    fmt.Println(genap) // [8 4 6]
    fmt.Println(besar) // [8 9 6]
}

saring tidak tahu kriterianya — ia hanya tahu bentuknya: func(int) bool. Pemanggil mengirim fungsi anonim berbeda untuk hasil berbeda dari kode yang sama. Pola ini adalah inti gaya fungsional di Go dan dipakai luas oleh pustaka standar.

Latihan singkat

Uji: buat saring(data, kriteria) lalu ambil yang habis dibagi 3 — program harus mencetak `[3 9 6]`.