Lompati ke konten utama
Modul 3 · Pelajaran 3 dari 513/50 dalam kursus~10 min
Pelajaran modul (3/5)

Fungsi variadik

Fungsi variadik menerima sejumlah argumen yang berubah-ubah tipe yang sama. Anda mendeklarasikannya dengan meletakkan ... sebelum tipe yang terakhir parameter. Di dalam fungsi, parameternya adalah slice.

Pernyataan

Go
func sum(nums ...int) int {
    tot := 0
    for _, n := range nums {
        tot += n
    }
    return tot
}

sum()              // 0   (nums = []int{})
sum(1)             // 1
sum(1, 2, 3, 4)    // 10

Hanya parameter last yang dapat bersifat variadik:

Go
func log(prefix string, values ...any) { ... }   // ok
// func wrong(...int, suffix string) {}            // ERRORE

Menyebarkan sepotong

Jika Anda sudah memiliki sepotong, Anda bisa meneruskannya ke fungsi variadik dengan ...:

Go
nums := []int{1, 2, 3}
sum(nums...)         // 6 — espande lo slice nei singoli argomenti

Tanda "..." muncul setelah irisan. Tanpa spread Anda akan mendapatkan tipe kesalahan: Anda akan meneruskan []int di mana fungsi mengharapkan urutan dari int.

nums adalah sebuah irisan, bukan wadah baru

Di dalam fungsi nums memiliki tipe []int. Semua irisan standar pekerjaan operasi: len(nums), nums[0], range, dll.

Kasus penggunaan klasik: fmt.Println

Semua fungsi Print* Print* bersifat variadik:

Go
// signature (semplificata):
// func Println(a ...any) (n int, err error)

fmt.Println("ciao", 42, true)
args := []any{"a", "b", "c"}
fmt.Println(args...)

Cobalah

Latihan#go.m3.l3.e1
Upaya: 0Memuat…

Definisikan sum(nums ...int) int yang mengembalikan jumlah semua argumen.

Memuat editor…
Tunjukkan petunjuk

Di dalam fungsi `nums` memiliki tipe `[]int`.

Solusi tersedia setelah 3 upaya

Latihan#go.m3.l3.e2
Upaya: 0Memuat…

Panggil fungsi penjumlahan yang ada dengan meneruskan angka irisan dengan spread `angka...`.

Memuat editor…
Tunjukkan petunjuk

Tanda `...` muncul SETELAH nama irisan.

Solusi tersedia setelah 3 upaya

Quiz#go.m3.l3.e3
Siap

Di dalam `func f(args ...string)`, tipe apa yang `args`?

Go
func f(args ...string) {
    _ = args
}
Pilihan jawaban

Rekap

  • ...T sebagai parameter TERAKHIR = fungsi variadik; di dalamnya ada []T.
  • Dipanggil dengan nilai tunggal: kompiler mengumpulkannya menjadi sebuah irisan.
  • Dipanggil dengan irisan yang sudah ada: slice... (menyebar, menggunakan kembali irisan tersebut).
  • Semua fungsi fmt.Print* bersifat variadik.
  • Hanya parameter terakhir yang dapat bersifat variadik.