Function as Parameter
Sebelumnya telah kita bahas bahwa di golang itu function bisa kita simpan sebagai value dari sebuah variable. Hal itu dapat kita lakukan karena sebenarnya function juga merupakan suatu tipe data. Karena sifat inilah kita juga bisa menggunakan function sebagai parameter function lainnya.
Contoh Kode
Untuk lebih memahami bagaimana fitur function as parameter ini digunakan, perhatikan contoh berikut ini:
package main
import (
"fmt"
"strings"
)
func formatAndPrint(text string, formatter func(string) string) {
formatted := formatter(text)
fmt.Println(formatted)
}
func upper(text string) string {
return strings.ToUpper(text)
}
func lower(text string) string {
return strings.ToLower(text)
}
func main() {
formatAndPrint("hello world", upper)
formatAndPrint("HELLO WORLD", lower)
}
output:
HELLO WORLD
hello world
Pada contoh di atas, kita membuat sebuah function bernama formatAndPrint
yang memiliki dua parameter yaitu text
yang akan diformat dan diprint, kemudian formatter
yaitu function yang akan digunakan untuk memformat text.
Berikutnya kita membuat dua buah formatter function bernama upper
(merubah text menjadi huruf besar) dan lower
(merubah text menjadi huruf kecil). Function inilah yang nantinya bertindak sebagai function as parameter untuk function formatAndPrint
.
Terakhir pada function main
kita panggil formatAndPrint
sebanyak dua kali, yang pertama menggunakan upper
formatter, dan yang kedua menggunakan lower
formatter.
Pada output dari kode programnya dapat kamu lihat text yang pertama menjadi huruf besar semua dan text yang kedua menjadi huruf kecil semua.
Menggunakan Type Declaration Untuk Alias Function
Tentu kamu tidak lupa kan materi tentang type declaration? Type declaration bisa kita gunakan untuk membuat alias suatu function. Pada contoh kode, kita menuliskan function lengkap dengan parameter dan return type-nya ketika membuat function as parameter. Contohnya seperti ini:
func formatAndPrint(text string, formatter func(string) string) {
...
}
Ada kalanya ketika function yang kita buat memiliki jumlah parameter yang banyak sehingga membuat kode kita kurang rapi. Untuk mengatasi hal itu, kita bisa membuat type declaration untuk function kita, misalnya seperti ini:
type Formatter func(string) string
sehingga deklarasi function formatAndPrint
menjadi seperti ini:
func formatAndPrint(text string, formatter Formatter) {
...
}
Apa Manfaatnya?
Sebenarnya jika kamu perhatikan lagi contoh kode yang tadi kita buat, kamu akan menyadari bahwa kita bisa memiliki banyak jenis formatter dengan membuat function yang baru. Inilah manfaat dari fitur function as parameter. Pada contoh kode tersebut kita bisa lebih fleksibel mau menggunakan formater apapun ketika kita memanggil function formatAndPrint
. Contoh lainnya adalah ketika kita membuat function yang mendapatkan data dari API namun kita memiliki cara yang berbeda-beda misalnya bisa menggunakan REST, atau GraphQL. Kita bisa memisahkan cara-cara tersebut menjadi function tersendiri, baru kemudian kita jadikan parameter untuk function yang mendapatkan data.
Kode sederhananya mungkin terlihat seperti berikut ini:
...
type User struct {
id int
name string
}
type Fetcher func(id int) User
// Fetch data menggunakan REST
func withREST(id int) User {
...
}
// Fetch data menggunakan GraphQL
func withGraphQL(id int) User {
...
}
// Mendapatkan data user berdasarkan id
func getUser(id int, fetcher Fetcher) User {
...
}
func main() {
userFromRest := getUser(1, withREST)
userFromGraphQL := getUser(1, withGraphQL)
}
...
Berikutnya: Anonymous Function