Artikel ini merupakan bagian dari seri Belajar Golang Dari Dasar

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

comments powered by Disqus
Lightbox