Fungsi bernama cocok untuk logika yang dipakai berulang kali, tetapi tidak semua tugas setara itu: komparator satu baris untuk pengurutan, inisialisasi sekali jalan, atau callback yang hanya relevan di satu tempat. Memberi nama pada fungsi yang hanya hidup di satu lokasi justru menambah kebisingan kode. Go menjawab dengan anonymous function — fungsi literal tanpa nama yang dideklarasikan tepat di tempat fungsi tersebut dibutuhkan. Pada chapter ini kita akan menyimpannya ke variabel, memanggilnya seketika, dan mengirimkannya sebagai argumen.
Function Literal Tanpa Nama #
Bentuk anonymous function sama persis dengan fungsi bernama, hanya tanpa nama setelah keyword func. Spec Go menyebutnya function literal — kebalikan dari fungsi bernama seperti literal string "Halo" adalah kebalikan variabel string. Nilainya bisa langsung ditugaskan ke variabel:
kuadrat := func(x int) int {
return x * x
}
fmt.Println("kuadrat(6) =", kuadrat(6))Variabel kuadrat kini menampung nilai fungsi bertipe func(int) int dan dipanggil seperti biasa. Perbedaan praktisnya dibanding fungsi bernama dirangkum pada tabel berikut:
| Aspek | Fungsi bernama | Anonymous function |
|---|---|---|
| Bentuk deklarasi | func nama(x int) int | func(x int) int |
| Lokasi deklarasi | Level package | Ekspresi di mana saja |
| Pemanggilan ulang | Dari mana pun lewat nama | Lewat variabel atau langsung |
| Cocok untuk | Logika dipakai ulang | Tugas sekali pakai |
Immediate Invocation (IIFE) #
Anonymous function boleh dipanggil pada saat yang sama dengan dideklarasikannya — cukup tambahkan tanda kurung setelah kurung tutup badan fungsi. Pola ini dikenal sebagai immediately invoked function expression (IIFE):
func() {
fmt.Println("Halo dari fungsi tanpa nama")
}()Tanda kurung (4, 5) setelah badan fungsi berarti argumen untuk parameter a dan b — fungsi dieksekusi seketika dan hasilnya langsung ditampung:
hasil := func(a, b int) int {
return a*b + 10
}(4, 5)Sebagai Argumen Sekali Pakai #
Peran yang paling sering kita temui adalah callback inline. Fungsi proses di program utuh menerima parameter transform func(int) int; alih-alih membuat fungsi bernama khusus, kita cukup menuliskan logikanya langsung di tempat pemanggilan:
bilangan := []int{3, 8, 2}
dobel := proses(bilangan, func(v int) int { return v * 2 })Pola yang sama muncul di standard library: komparator slices.SortFunc, filter di slices.DeleteFunc, hingga handler http.HandleFunc. Logicanya terbaca persis di tempat dipakai — pembaca tidak perlu melompat ke deklarasi jauh di atas.
Pintu ke Goroutine #
Satu pemakaian khas anonymous function yang akan sering kita lihat adalah membungkus tugas paralel. Menambahkan keyword go di depan IIFE menjalankan fungsi tersebut sebagai goroutine baru:
go func() {
fmt.Println("berjalan paralel")
}()Detail konkurensi — channel, sinkronisasi, WaitGroup — adalah bahasan section tersendiri; saat ini cukup kenali bentuknya karena hampir seluruh kode goroutine modern memakai anonymous function. Pembahasan lengkapnya dimulai di chapter Goroutine
.
Program Utuh #
Berkas anonymous-demo.go mempraktikkan keempat bentuk di atas dalam satu program. Jalankan dari direktori chapter:
go run anonymous-demo.goOutput yang Dihasilkan:
kuadrat(6) = 36
Halo dari fungsi tanpa nama
hasil = 30
dobel = [6 16 4]Mari kita telaah baris demi baris program di atas:
- Baris 6 (
func proses(data []int, transform func(int) int)): menerima callback bertipe fungsi dan menerapkannya ke setiap elemendata. - Baris 16 (
kuadrat := func(x int) int): menugaskan function literal ke variabelkuadrat— bentuk paling dasar anonymous function. - Baris 22–24 (
func() { ... }()): IIFE tanpa parameter yang mencetak sapaan lalu langsung selesai. - Baris 27–29 (
func(a, b int) int { ... }(4, 5)): IIFE berparameter yang mengembalikan4*5+10seketika. - Baris 34 (
proses(bilangan, func(v int) int { return v * 2 })): mengirim function literal satu baris sebagai argumen tanpa memberinya nama.
Referensi #
- Function declarations — Go Spec — bagian function literal dan closure.
- A Tour of Go: more types — latihan resmi function values.
- Effective Go: concurrency — pemakaian anonymous function bersama goroutine.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
anonymous-demo.go
Unduh berkaspackage main
import "fmt"
// proses menjalankan fungsi transformasi terhadap setiap elemen data.
func proses(data []int, transform func(int) int) []int {
hasil := make([]int, 0, len(data))
for _, v := range data {
hasil = append(hasil, transform(v))
}
return hasil
}
func main() {
// Anonymous function disimpan dalam variabel.
kuadrat := func(x int) int {
return x * x
}
fmt.Println("kuadrat(6) =", kuadrat(6))
// IIFE: anonymous function langsung dipanggil tanpa nama.
func() {
fmt.Println("Halo dari fungsi tanpa nama")
}()
// Anonymous function berparameter langsung dipanggil.
hasil := func(a, b int) int {
return a*b + 10
}(4, 5)
fmt.Println("hasil =", hasil)
// Anonymous function dikirim sebagai argumen.
bilangan := []int{3, 8, 2}
dobel := proses(bilangan, func(v int) int { return v * 2 })
fmt.Println("dobel =", dobel)
}