1 Dasar-dasar Fungsi

Dalam pemrograman, fungsi merupakan sepotong kode yang menyelesaikan tugas tertentu dan dapat memiliki parameter masukan serta nilai kembalian. Dalam bahasa Go, fungsi digunakan secara luas untuk mengorganisir dan menggunakan kembali kode. Penggunaan fungsi secara efektif dapat membuat kode lebih ringkas, sangat mudah dibaca, dan mudah dipelihara.

Fungsi merupakan komponen inti dari bahasa Go, dan pemahaman terhadap bagaimana mendeklarasikan dan mendefinisikan fungsi sangat penting untuk menulis kode yang efisien dan mudah dipahami.

2 Mendefinisikan Fungsi

2.1 Mendeklarasikan Fungsi

Dalam bahasa Go, bentuk umum dari deklarasi fungsi adalah:

func namaFungsi(parameter) tipeKembalian {
    // Isi fungsi
}

Mari kita bahas komponen-komponen ini:

  1. Kata kunci func digunakan untuk mendeklarasikan sebuah fungsi.
  2. namaFungsi adalah nama dari fungsi, mengikuti konvensi penamaan dalam bahasa Go. Fungsi dengan huruf awal berupa huruf kapital dapat diekspor, artinya dapat dilihat di luar paket; fungsi dengan huruf awal berupa huruf kecil tidak dapat diekspor dan hanya dapat digunakan dalam paket yang sama.
  3. parameter adalah daftar parameter yang diterima oleh fungsi, dipisahkan oleh koma. Tipe dari setiap parameter perlu ditentukan, dan jika beberapa parameter memiliki tipe yang sama, tipe tersebut hanya perlu ditentukan sekali.
  4. tipeKembalian adalah tipe dari nilai kembalian fungsi. Jika fungsi tidak mengembalikan nilai, bagian ini dapat dihilangkan. Jika fungsi mengembalikan beberapa nilai, mereka perlu diapit dalam tanda kurung.

Sebagai contoh, kita dapat mendeklarasikan sebuah fungsi sederhana untuk menghitung jumlah dari dua bilangan bulat:

func Tambah(a int, b int) int {
    return a + b
}

Pada contoh ini, nama fungsi adalah Tambah, menerima dua parameter bertipe int (a dan b), dan mengembalikan jumlah keduanya dengan tipe kembalian int.

2.2 Daftar Parameter

Daftar parameter mendefinisikan parameter apa yang diterima oleh fungsi dan tipe dari masing-masing parameter tersebut. Parameter merupakan jenis variabel khusus yang digunakan untuk meneruskan data ke fungsi.

func Sapa(nama string, usia int) {
    fmt.Printf("Halo, %s! Kamu berusia %d tahun.\n", nama, usia)
}

Dalam fungsi Sapa ini, nama dan usia adalah parameter. Tipe dari nama adalah string, dan tipe dari usia adalah int. Ketika memanggil fungsi ini, nilai nyata harus diberikan untuk parameter-parameter ini.

2.3 Tipe Kembalian

Fungsi dapat mengembalikan hasil perhitungan, dan tipe kembalian menentukan jenis data dari nilai kembalian fungsi. Fungsi dapat tidak memiliki nilai kembalian, atau dapat memiliki satu atau lebih nilai kembalian.

Jika sebuah fungsi memiliki beberapa nilai kembalian, tipe-tipe tersebut perlu diapit dalam tanda kurung saat deklarasi:

func Bagi(dividen, pembagi float64) (float64, error) {
    if pembagi == 0 {
        return 0, errors.New("tidak dapat dibagi dengan nol")
    }
    return dividen / pembagi, nil
}

Fungsi Bagi di sini mengembalikan dua nilai: hasil bagi dan pesan error. Jika pembagi adalah nol, maka akan dikembalikan sebuah error.

2.4 Parameter Variadik

Dalam Golang, ketika kita tidak yakin berapa banyak parameter yang akan dilewatkan saat mendefinisikan sebuah fungsi, kita dapat menggunakan parameter variadik. Parameter variadik ditandai dengan titik tiga ..., yang berarti fungsi dapat menerima sejumlah parameter apa pun. Hal ini sangat berguna saat menangani jumlah data yang tidak pasti atau mengimplementasikan jenis fungsi tertentu seperti fungsionalitas pemformatan, ringkasan, atau iterasi.

Skenario Aplikasi

Parameter variadik umum digunakan dalam skenario berikut:

  1. Penggabungan string: seperti fungsi fmt.Sprintf dan strings.Join.
  2. Pemrosesan array/slice: saat menangani array atau slice dengan panjang yang bervariasi, seperti menghitung jumlah atau menggabungkan beberapa slice.
  3. Logging dan penanganan error: saat menangani beberapa error atau mencatat informasi log yang banyak, seperti log.Printf atau fungsi ringkasan error kustom.
  4. Fungsi pembantu: digunakan dalam API atau pustaka untuk memberikan pengguna dengan cara yang lebih fleksibel untuk memanggil fungsi.

Menggunakan Parameter Variabel

Berikut adalah contoh sederhana penggunaan parameter variabel:

// Mendefinisikan fungsi yang mengambil sejumlah parameter bilangan bulat dan mengembalikan jumlah mereka
func Jumlah(nums ...int) int {
    total := 0
    for _, num := range nums {
        total += num
    }
    return total
}

func main() {
    // Anda dapat melewati sejumlah parameter apa pun
    fmt.Println(Jumlah(1, 2))          // Output: 3
    fmt.Println(Jumlah(1, 2, 3, 4))    // Output: 10
    
    // Anda juga dapat melewati sebuah slice dan menggunakan titik tiga setelah slice tersebut
    angka := []int{1, 2, 3, 4, 5}
    fmt.Println(Jumlah(angka...))    // Output: 15
}

Pada fungsi Jumlah, nums adalah sebuah slice dari bilangan bulat yang berisi semua parameter yang dilewati ke fungsi Jumlah. Kita dapat menggunakan perulangan range untuk mengiterasi melalui slice ini dan menghitung jumlahnya.

Harus diingat bahwa parameter variabel di dalam fungsi sebenarnya adalah sebuah slice, sehingga semua operasi terkait slice dapat digunakan. Ketika Anda perlu melewati sebuah slice sebagai parameter variabel ke sebuah fungsi, cukup tambahkan titik tiga ... setelah slice tersebut.

Menggunakan parameter variabel dapat membuat pemanggilan fungsi lebih fleksibel dan ringkas, namun juga akan sedikit memengaruhi kinerja, karena penggunaan parameter variabel melibatkan pembuatan slice dan alokasi memori. Oleh karena itu, berhati-hatilah ketika ada persyaratan kinerja yang ketat.

Tip: Penjelasan rinci tentang slice akan diberikan di bab-bab selanjutnya. Jika Anda memiliki pengalaman dengan bahasa pemrograman lain, Anda dapat sementara menganggapnya sebagai array.

3 Memanggil Fungsi

3.1 Pemanggilan Fungsi Dasar

Memanggil sebuah fungsi berarti mengeksekusi kode dari fungsi tersebut. Di Go, memanggil fungsi yang telah didefinisikan sangatlah mudah, cukup gunakan nama fungsi dan lewatkan parameter yang sesuai. Sebagai contoh:

hasil := tambah(3, 4)
fmt.Println(hasil)  // Output: 7

Pada contoh ini, fungsi tambah dipanggil dan dua bilangan bulat dilewatkan sebagai parameter, dan kemudian hasil yang dikembalikan di-assign ke variabel hasil.

3.2 Melewatkan Parameter

Ketika melewati parameter ke sebuah fungsi, Go secara default menggunakan melewati-by-value, yang berarti melewati salinan nilai parameter, dan data asli tidak akan berubah. Namun, jika Anda ingin fungsi memodifikasi variabel eksternal atau karena alasan kinerja, Anda dapat menggunakan melewati-by-reference, seperti menggunakan pointer atau melewati struct besar.

Berikut contoh dari melewati-by-value dan melewati-by-reference:

// Contoh melewati-by-value
func kali(nilai int) {
    nilai *= 2
}

// Contoh melewati-by-reference
func kaliPtr(nilai *int) {
    *nilai *= 2
}

func main() {
    nilai := 3
    kali(nilai)
    fmt.Println(nilai)  // Output: 3, nilai tetap tidak berubah

    kaliPtr(&nilai)
    fmt.Println(nilai)  // Output: 6, nilai digandakan
}

Pada contoh di atas, fungsi kali mencoba menggandakan nilai yang dilewatkan, namun hanya menggandakan salinannya, membuat nilai variabel asli tetap tidak berubah. Namun, fungsi kaliPtr mengubah nilai dari variabel asli dengan menerima pointer ke variabel integer sebagai parameter.