Closure Di Golang
Closure adalah kombinasi dari function yang dibundle bersama dengan scope di sekitarnya. Di dalam closure, kita bisa mengakses scope yang berada di luar function dari dalam function itu sendiri karena merupakan satu scope yang sama. Saat menggunakan closure, kamu harus berhati-hati agar terhindar dari ketidaksengajaan merubah data diluar function. Secara sederhana, closure adalah function yang berada di dalam function.
Contoh Closure
package main
import "fmt"
func main() {
name := "Rizky Kurniawan"
printName := func() {
fmt.Println(name)
}
printName()
}
output:
Rizky Kurniawan
Dari contoh diatas, kamu bisa melihat bahwa kita membuat sebuah function di dalam function main
. Di dalamnya, kita memprint nilai dari variabel name
yang berada diluar function. Keadaan inilah yang disebut sebagai closure.
Hati-hati Saat Menggunakan Closure
Seperti penjelasan sebelumnya, kita harus berhati-hati ketika menggunakan closure. Karena kita bisa mengakses variabel yang berada diluar function (seperti saat mengakses variable name
), maka kita bisa saja tidak sengaja merubah nilai dari variable tersebut. Pada beberapa kasus, hal ini akan berbahaya. Contohnya sebagai berikut:
package main
import "fmt"
func main() {
name := "Rizky Kurniawan"
printName := func() {
// anggap saja tidak sengaja merubah isi variabel name
name = "Tony Stark"
fmt.Println(name)
}
printName()
}
output:
Tony Stark
Nah itu dia, dari contoh tersebut dapat kamu lihat bahwa kita bisa mengganti nilai variable name
dari dalam function printName
. Maka, ketika kita print yang ditampilkan adalah nama tidak sengaja kita ubah.
Perlu kamu ketahui bahwa perubahan ini tidak hanya berlaku di dalam function printName
saja, tetapi juga berlaku di luar function printName
setelah function tersebut di panggil. Jika kamu mencoba memprint variabel name
di luar function printName
setelah pemanggilan function, maka nilainya akan tetap seperti setelah dirubah yaitu Tony Stark
.
package main
import "fmt"
func main() {
name := "Rizky Kurniawan"
printName := func() {
// anggap saja tidak sengaja merubah isi variabel name
name = "Tony Stark"
fmt.Println("Di dalam function printName")
fmt.Println(name)
}
// kita panggil function-nya
printName()
fmt.Println("Di luar function printName")
fmt.Println(name)
}
output:
Di dalam function printName
Tony Stark
Di luar function printName
Tony Stark
Berikutnya: #29: Defer, Panic, & Recover