
Tim Solusi Cloud Mail.ru telahmenerjemahkan artikel tentang fungsi variadic di Go. Penulisnya menjelaskan bagaimana fungsi variadic berbeda dari fungsi biasa dan bagaimana membuatnya.
Apa itu fungsi variadic
Fungsi - sepotong kode yang dirancang untuk melakukan tugas tertentu. Fungsi ini meneruskan satu atau beberapa argumen, dan mengembalikan satu atau lebih hasil.
Fungsi varian sama dengan fungsi biasa, tetapi dapat menggunakan argumen dalam jumlah tak terbatas atau variabel.
func f(elem ...Type)
Seperti inilah sintaks fungsi variadic yang khas. Operator
..., juga disebut operator tinju, memberi tahu Go untuk menyimpan semua argumen tipe Typedalam sebuah parameter elem. Dengan kata lain, Go membuat variabel elemdengan tipe []Type, yaitu slice. Dan semua argumen yang diteruskan ke fungsi tersebut disimpan dalam slice elem.
Mari kita lihat contoh sebuah fungsi
append().
append([]Type, args, arg2, argsN)
Fungsi ini
appendmengharapkan argumen pertama menjadi potongan tipe Typediikuti dengan sejumlah argumen yang berubah-ubah. Tapi bagaimana Anda menambahkan irisan s2ke dalam irisan s1?
Ini mengikuti dari definisi fungsi
append()bahwa kita tidak dapat meneruskan dua irisan ke sana - Typehanya ada satu jenis argumen . Oleh karena itu, kami menggunakan operator unboxing ...untuk mengekstrak potongan menjadi serangkaian argumen. Mereka kemudian dapat diteruskan ke fungsi tersebut append.
append(s1, s2...)
...menunjukkan operator pengepakan dan operator pembongkaran. Operator unboxing selalu muncul setelah nama variabel.
Dalam contoh kami, irisan
s1dan s2jenis yang sama. Kita biasanya mengetahui parameter suatu fungsi dan jumlah argumen yang dibutuhkan. Bagaimana suatu fungsi acceptmengetahui berapa banyak parameter yang telah diteruskan padanya?
Jika Anda melihat deklarasi fungsi
append, Anda dapat melihat ekspresinya elems ...Type. Itu mengemas semua argumen, dimulai dengan yang kedua, menjadi sepotong elems.
func append(slice []Type, elems ...Type) []Type
Hanya argumen terakhir dalam deklarasi fungsi yang bisa variadic.
Oleh karena itu, argumen pertama untuk fungsi
appendtersebut hanyalah sebuah slice, karena ini didefinisikan sebagai sebuah slice. Semua argumen berikutnya dikemas ke dalam satu argumen bernama elems.
Sekarang mari kita lihat cara membuat fungsi variadic Anda sendiri.
Cara membuat fungsi variadic
Seperti disebutkan di atas, fungsi variadic adalah fungsi reguler yang menggunakan sejumlah variabel argumen. Untuk melakukan ini, Anda perlu menggunakan operator tinju
...Type.
Mari kita tulis fungsi
getMultiplesdengan argumen factortipe pertama int(faktor perkalian) dan sejumlah variabel dari argumen tipe tambahan int. Mereka akan dikemas menjadi irisan args.
Gunakan untuk
makemembuat irisan kosong, ukurannya sama dengan irisan args. Menggunakan satu putaran for range, kalikan elemen potongan argsdengan factor. Kami memasukkan hasilnya ke dalam potongan kosong baru multiples, yang akan kami kembalikan sebagai hasil dari fungsi tersebut.
func getMultiples(factor int, args ...int) []int {
multiples := make([]int, len(args))
for index, val := range args {
multiples[index] = val * factor
}
return multiples
}
Ini adalah fungsi yang sangat sederhana, terapkan di dalam blok
main().
func main() {
s := []int{10, 20, 30}
mult1 := getMultiples(2, s...)
mult2 := getMultiples(3, 1, 2, 3, 4)
fmt.Println(mult1)
fmt.Println(mult2)
}
https://play.go.org/p/BgU6H9orhrn
Apa yang terjadi jika, dalam contoh di atas, Anda meneruskan sebuah slice ke suatu fungsi
getMultiplessebagai argumen kedua? Kompilator akan melaporkan kesalahan: dalam argumengetMultiplesitu tidak dapat digunakans (type [] int)sebagai tipeint. Ini karena slice memiliki tipe yang[]int, getMultiplesmengharapkan parameter dariint.
Bagaimana irisan diteruskan ke fungsi variadic
Slice adalah referensi ke sebuah array. Jadi apa yang terjadi ketika Anda meneruskan sepotong ke fungsi variadic menggunakan operator unboxing? Apakah Go membuat potongan baru
argsatau menggunakan potongan lama s?
Karena kami tidak memiliki alat perbandingan
args == s, kami perlu mengubah irisan args. Kemudian kami mencari tahu apakah potongan aslinya telah berubah s.
https://play.go.org/p/fbNgVGu6JZO
Pada contoh di atas, kami sedikit mengubah fungsinya
getMultiples. Dan alih-alih membuat potongan baru, kami menetapkan hasil kalkulasi ke elemen potongan args, mengganti elemen yang masuk dengan elemen yang dikalikan.
Hasilnya, kami melihat bahwa nilai-nilai potongan asli
stelah berubah. Jika Anda meneruskan argumen ke fungsi variadic melalui operator unboxing, Go menggunakan referensi ke larik data yang mendasari aslinya untuk membuat potongan baru. Berhati-hatilah agar tidak membuat kesalahan, jika tidak data asli akan berubah sebagai hasil perhitungan.
Semoga berhasil!
Apa lagi yang harus dibaca: