Defer
Golang memiliki satu fungsi yang spesial yakni defer. Kegunaan dari defer adalah mengeksekusi suatu fungsi ketika fungsi yang lain telah selesai dijalankan. Defer sangat berguna dalam menghadapi berbagai fungsi yang berjalan bersama-sama namun memerlukan beberapa fungsi yang berjalan secara sekuensial.
Contohnya kita memiliki fungsi A dan fungsi B. Jika kita inggin fungsi B dijalankan setelah proses di fungsi A ini selesai maka kita harus menggunakan defer. Defer ini bekerja seperti mekanisme scheduling yang melihat status (selesai atau belum selesai) dijalankannya fungsi lainnya.
Perhatikan kode dibawah ini untuk mengetahui tentang mekanisme penggunaan defer
package main import ( "fmt" ) func main() { defer satu() dua() } func satu() { fmt.Println("satu") } func dua() { fmt.Println("dua") }
ketika kode diatas dijalankan maka
- fungsi dua akan dieksekusi terlebih dahulu
- Setelah fungsi dua dieksekusi maka fungsi pertama baru dieksekusi
tampilkan pada konsol jika kode diatas dijalankan
Implementasi defer
Perhatikan kode dibawah ini
package main import ( "os" ) func main() { file, _ := os.Open("./dega.txt") defer file.Close() }
ketika kita membuka file maka fungsi file.Close() akan dieksekusi setelah file tersebut dibuka untuk mengurangi beban memory. Ini adalah kegunaan dari defer.
Panic & Recover
panic atau dalam bahasa indonesia adalah panik yang berarti kondisi dimana kita sedang kebingungan terkait dengan suatu kondisi. Pada pemrograman golang panic adalah fungsi yang dapat melakukan raise atau membuat runtime error atau mudahnya untuk membuat error.
Sedangkan recover memiliki fungsi yang kebalikan dengan panic yakni menghilangkan panic / runtime error
package main func main() { panic("something wrong...") }
kode diatas jika dieksekusi akan menghasilkan runtime error
untuk dapat menggunakan recover maka kita dapat mengkombinasikannya dengan defer. Recover akan dieksekusi setelah runtime error diraise oleh sistem
package main import ( "fmt" ) func main() { defer func() { pesanError := recover() fmt.Println(pesanError) }() // () ini digunakan untuk menginvoke fungsi panic("something wrong...") }
kode diatas jika dijalankan akan menghasilkan tampilan seperti ini pada konsol
runtime error yang diraise tidak ditampilkan pada konsol karena telah “direcover”. tanpa penggunaan defer recover ini tidak dapat berjalan. Secara default fungsi recover() mereturn nilai dari panic.