Function as Parameter
Sebelumnya telah kita bahas bahwa di golang itu function Dapat 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 Dapat menggunakan function sebagai parameter function lainnya.
Teladan Kode
Buat lebih memahami bagaimana fitur function as parameter ini digunakan, perhatikan Teladan 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:
Pada Teladan di atas, kita Membangun sebuah function bernama formatAndPrint
yang Mempunyai dua parameter Merukapan text
yang akan diformat dan diprint, kemudian formatter
Merukapan function yang akan digunakan Buat memformat text.
Berikutnya kita Membangun 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 Buat 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 Anda lihat text yang pertama menjadi huruf besar Sekalian dan text yang kedua menjadi huruf kecil Sekalian.
Menggunakan Type Declaration Buat Alias Function
Tentu Anda Enggak lupa kan materi tentang type declaration? Type declaration Dapat kita gunakan Buat Membangun alias suatu function. Pada Teladan kode, kita menuliskan function lengkap dengan parameter dan return type-nya ketika Membangun function as parameter. Contohnya seperti ini:
func formatAndPrint(text string, formatter func(string) string) {
...
}
Terdapat kalanya ketika function yang kita buat Mempunyai jumlah parameter yang banyak sehingga Membangun kode kita kurang rapi. Buat mengatasi hal itu, kita Dapat Membangun type declaration Buat 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 Apabila Anda perhatikan Kembali Teladan kode yang tadi kita buat, Anda akan menyadari bahwa kita Dapat Mempunyai banyak jenis formatter dengan Membangun function yang baru. Inilah manfaat dari fitur function as parameter. Pada Teladan kode tersebut kita Dapat lebih Elastis mau menggunakan formater apapun ketika kita memanggil function formatAndPrint
. Teladan lainnya adalah ketika kita Membangun function yang mendapatkan data dari API Tetapi kita Mempunyai Metode yang berbeda-beda misalnya Dapat menggunakan REST, atau GraphQL. Kita Dapat memisahkan Metode-Metode tersebut menjadi function tersendiri, baru kemudian kita jadikan parameter Buat 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