Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Gelung `untuk...julat` Go Mengendalikan Pembolehubah Penutupan dan Bagaimana Saya Boleh Mengelak Gelagat Tidak Dijangka?

Bagaimanakah Gelung `untuk...julat` Go Mengendalikan Pembolehubah Penutupan dan Bagaimana Saya Boleh Mengelak Gelagat Tidak Dijangka?

Linda Hamilton
Lepaskan: 2024-12-30 08:33:02
asal
973 orang telah melayarinya

How Do Go's `for...range` Loops Handle Closure Variables, and How Can I Avoid Unexpected Behavior?

Penutupan yang Dirakam dalam Go: Memahami Tingkah Laku Pembolehubah Gelung Julat

Dalam Go, untuk...gelung julat berkelakuan berbeza berbanding dengan yang lain untuk- gelung kerana rawatan mereka sebagai penutup. Artikel ini meneroka nuansa menangkap pembolehubah gelung julat dalam pembolehubah penutupan.

Gelagat Penutupan yang Dirakam dalam Gelung Julat

Tidak seperti dalam gelung foreach C#, Go's for... gelung menangkap pembolehubah gelung (cth., kunci dan nilai) sebagai pembolehubah penutupan. Walau bagaimanapun, Go tidak menangkap pembolehubah ini secara langsung daripada skop gelung. Sebaliknya, ia menangkapnya sebagai nilai terakhir yang ditetapkan dalam penutupan gelung.

Tingkah laku ini menjadi jelas apabila cuba menggunakan penutupan untuk membuat tupel dalam Go, seperti yang ditunjukkan dalam kod contoh. Penutupan menangkap nilai terakhir yang diberikan kepada pembolehubah k dan v semasa gelung untuk...julat, yang membawa kepada tingkah laku yang salah.

Betulkan: Menyalin Pembolehubah untuk Tangkapan

Untuk menangani isu ini, adalah perlu untuk menyalin pembolehubah gelung secara eksplisit ke dalam pembolehubah tempatan menggunakan pengendali := sebelum menangkapnya dalam penutupan.

for k, v := range m {
    kLocal, vLocal := k, v // Copy values to local variables
    f[i] = func() {
        return kLocal, vLocal
    }
}
Salin selepas log masuk

Dengan menyalin k dan v ke kLocal dan vLocal, penutupan kini boleh mengakses nilai yang dimaksudkan dengan betul untuk pembolehubah gelung semasa lelaran untuk...julat.

Penutupan vs. Literal Fungsi

Adalah penting untuk mengambil perhatian perbezaan antara penutupan dan literal fungsi dalam Pergi. Literal fungsi mencipta fungsi baharu terikat pada skop semasa, manakala penutupan mengekalkan akses kepada skop tertutup dan pembolehubah kongsinya.

Gelung Nilai lwn. Gelung Pembolehubah

Selain itu, Go membezakan antara gelung nilai dan gelung pembolehubah, di mana gelung nilai mengikat salinan pembolehubah gelung pada setiap penutupan manakala gelung pembolehubah mengikat pembolehubah gelung sebenar itu sendiri. Ini boleh membawa kepada tingkah laku yang berbeza, seperti yang diperhatikan dalam kod contoh.

Kesimpulannya, menangkap pembolehubah gelung julat dalam penutupan dalam Go memerlukan perhatian kepada skop penutupan dan penggunaan pembolehubah setempat untuk menyalin nilai yang dikehendaki. Memahami konsep ini adalah penting untuk menulis kod Go yang berkesan dan mantap.

Atas ialah kandungan terperinci Bagaimanakah Gelung `untuk...julat` Go Mengendalikan Pembolehubah Penutupan dan Bagaimana Saya Boleh Mengelak Gelagat Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan