Dalam Go, penutupan dan parameter fungsi menyediakan mekanisme yang berbeza untuk mengendalikan pembolehubah dalam fungsi tanpa nama. Mari kita mendalami nuansa dan meneroka apabila satu pendekatan lebih unggul daripada pendekatan yang lain.
Apabila fungsi tanpa nama bertindak sebagai penutup, ia mengekalkan akses kepada pembolehubah yang ditakrifkan dalam skop sekeliling. Pembolehubah ini dikongsi antara semua keadaan penutupan, bermakna ia merujuk kepada alamat memori yang sama. Ini boleh berfaedah apabila anda mahu berbilang panggilan fungsi beroperasi pada data yang sama, seperti mengekalkan jumlah berjalan atau menambah pembilang.
Sebaliknya, apabila anda lulus parameter kepada fungsi tanpa nama, fungsi menerima salinan nilai. Ini bermakna bahawa setiap contoh fungsi mempunyai salinan pembolehubah tersendiri, diasingkan daripada skop panggilan. Ini berfaedah apabila anda mahu setiap panggilan fungsi beroperasi secara bebas, tanpa menjejaskan nilai asal.
Pilihan antara menggunakan penutupan atau parameter fungsi bergantung pada tingkah laku yang dimaksudkan . Jika anda memerlukan semua panggilan fungsi untuk berkongsi pembolehubah yang sama dan pengubahsuaiannya, penutupan adalah lebih sesuai. Sebaliknya, jika setiap panggilan fungsi harus beroperasi pada salinan pembolehubahnya sendiri, parameter harus digunakan.
Untuk menggambarkan perbezaan ini, pertimbangkan perkara berikut contoh:
Penutupan:
for i := 0; i < 3; i++ { go func() { fmt.Println(i) }() }
Parameter:
for i := 0; i < 3; i++ { go func(v int) { fmt.Println(v) }(i) }
Dalam contoh penutupan, semua fungsi panggilan akan mengakses pembolehubah kongsi yang sama i, yang mempunyai nilai akhir 3 apabila goroutine dilaksanakan. Ini menyebabkan output 3 dicetak tiga kali.
Dalam contoh parameter fungsi, bagaimanapun, setiap panggilan fungsi menerima salinan pembolehubah i pada masa panggilan. Oleh itu, output ialah 0, 1 dan 2, kerana setiap goroutine mencetak nilai i pada masa ia diluluskan sebagai hujah.
Atas ialah kandungan terperinci Penutupan lwn Parameter dalam Go: Bila Menggunakan Mana untuk Fungsi Tanpa Nama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!