Variadic, Closure & Function sebagai Nilai
Parameter ...T, anonymous function, dan closure yang mengingat variable.
Variadic function
Tambahkan ... sebelum tipe agar function menerima sejumlah argumen. Di dalam function, parameter itu berupa slice.
func jumlah(angka ...int) int {
total := 0
for _, n := range angka {
total += n
}
return total
}
fmt.Println(jumlah(1, 2, 3)) // 6
fmt.Println(jumlah()) // 0
Untuk memasukkan slice yang sudah ada, tambahkan ... setelahnya: jumlah(daftar...). Contoh variadic yang kamu kenal: fmt.Println.
Anonymous function
Function tanpa nama, boleh langsung dijalankan:
func() {
fmt.Println("langsung jalan")
}()
Closure
Closure adalah function yang menangkap variable dari lingkup tempat ia dibuat dan tetap mengingatnya, meski lingkup itu sudah selesai.
func buatPenghitung() func() int {
count := 0
return func() int {
count++
return count
}
}
a := buatPenghitung()
fmt.Println(a(), a(), a()) // 1 2 3
b := buatPenghitung()
fmt.Println(b()) // 1 (count milik b sendiri)
Setiap pemanggilan buatPenghitung() membuat variable count baru, sehingga a dan b tidak saling mengganggu.
Kapan closure berguna?
- Menyimpan state tanpa struct (penghitung, generator ID).
- Callback (misalnya handler HTTP).
- Membuat function "pabrik", mis.
pengali(2)yang mengembalikan function pengali-dua.
Function sebagai parameter
func terapkan(angka []int, f func(int) int) []int {
hasil := []int{}
for _, n := range angka {
hasil = append(hasil, f(n))
}
return hasil
}
kuadrat := terapkan([]int{1, 2, 3}, func(n int) int { return n * n })
// [1 4 9]