A.22. Fungsi Sebagai parameter

Setelah pada chapter sebelumnya kita belajar mengenai fungsi yang mengembalikan nilai balik berupa fungsi, kali ini topiknya tidak kalah unik, yaitu fungsi yang digunakan sebagai parameter.

Di Go, fungsi bisa dijadikan sebagai tipe data variabel. Dari situ sangat memungkinkan untuk menjadikannya sebagai parameter juga.

A.22.1. Penerapan Fungsi Sebagai Parameter

Cara membuat parameter fungsi adalah dengan langsung menuliskan skema fungsi nya sebagai tipe data. Contohnya bisa dilihat pada kode berikut.

package main

import "fmt"
import "strings"

func filter(data []string, callback func(string) bool) []string {
    var result []string
    for _, each := range data {
        if filtered := callback(each); filtered {
            result = append(result, each)
        }
    }
    return result
}

Parameter callback merupakan sebuah closure yang dideklarasikan bertipe func(string) bool. Closure tersebut dipanggil di tiap perulangan dalam fungsi filter().

Fungsi filter() sendiri kita buat untuk filtering data array (yang datanya didapat dari parameter pertama), dengan kondisi filter bisa ditentukan sendiri. Di bawah ini adalah contoh pemanfaatan fungsi tersebut.

func main() {
    var data = []string{"wick", "jason", "ethan"}
    var dataContainsO = filter(data, func(each string) bool {
        return strings.Contains(each, "o")
    })
    var dataLenght5 = filter(data, func(each string) bool {
        return len(each) == 5
    })

    fmt.Println("data asli \t\t:", data)
    // data asli : [wick jason ethan]

    fmt.Println("filter ada huruf \"o\"\t:", dataContainsO)
    // filter ada huruf "o" : [jason]

    fmt.Println("filter jumlah huruf \"5\"\t:", dataLenght5)
    // filter jumlah huruf "5" : [jason ethan]
}

Ada cukup banyak hal yang terjadi di dalam tiap pemanggilan fungsi filter() di atas. Berikut merupakan penjelasannya.

  1. Data array (yang didapat dari parameter pertama) akan di-looping.
  2. Di tiap perulangannya, closure callback dipanggil, dengan disisipkan data tiap elemen perulangan sebagai parameter.
  3. Closure callback berisikan kondisi filtering, dengan hasil bertipe bool yang kemudian dijadikan nilai balik dikembalikan.
  4. Di dalam fungsi filter() sendiri, ada proses seleksi kondisi (yang nilainya didapat dari hasil eksekusi closure callback). Ketika kondisinya bernilai true, maka data elemen yang sedang diulang dinyatakan lolos proses filtering.
  5. Data yang lolos ditampung variabel result. Variabel tersebut dijadikan sebagai nilai balik fungsi filter().

Dasar Pemrograman Golang - Filtering data

Pada dataContainsO, parameter kedua fungsi filter() berisikan statement untuk deteksi apakah terdapat substring "o" di dalam nilai variabel each (yang merupakan data tiap elemen), jika iya, maka kondisi filter bernilai true, dan sebaliknya.

pada contoh ke-2 (dataLength5), closure callback berisikan statement untuk deteksi jumlah karakter tiap elemen. Jika ada elemen yang jumlah karakternya adalah 5, berarti elemen tersebut lolos filter.

Memang butuh usaha ekstra untuk memahami pemanfaatan closure sebagai parameter fungsi. Tapi setelah paham, penerapan teknik ini pada kondisi yang tepat akan sangat membantu proses pembuatan aplikasi.

A.22.2. Alias Skema Closure

Kita sudah mempelajari bahwa closure bisa dimanfaatkan sebagai tipe parameter, contohnya seperti pada fungsi filter(). Pada fungsi tersebut kebetulan skema tipe parameter closure-nya tidak terlalu panjang, hanya ada satu buah parameter dan satu buah nilai balik.

Pada fungsi yang skema-nya cukup panjang, akan lebih baik jika menggunakan alias, apalagi ketika ada parameter fungsi lain yang juga menggunakan skema yang sama. Membuat alias fungsi berarti menjadikan skema fungsi tersebut menjadi tipe data baru. Caranya dengan menggunakan keyword type. Contoh:

type FilterCallback func(string) bool

func filter(data []string, callback FilterCallback) []string {
    // ...
}

Skema func(string) bool diubah menjadi tipe dengan nama FilterCallback. Tipe tersebut kemudian digunakan sebagai tipe data parameter callback.


Di bawah ini merupakan penjelasan tambahan mengenai fungsi strings.Contains().

A.22.2.1. Penggunaan Fungsi string.Contains()

Inti dari fungsi ini adalah untuk deteksi apakah sebuah substring adalah bagian dari string, jika iya maka akan bernilai true, dan sebaliknya. Contoh penggunaannya:

var result = strings.Contains("Golang", "ang")
// true

Variabel result bernilai true karena string "ang" merupakan bagian dari string "Golang".