Fungsi varian di Go

fade by clockbirds



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 fungsigetMultiplessebagai 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 aslistelah 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:



  1. Pergi dan cache CPU
  2. Mengapa pengembang backend harus mempelajari bahasa pemrograman Go
  3. Saluran telegram kami tentang transformasi digital



All Articles