Rumah > pembangunan bahagian belakang > Golang > Mengapa Goroutine Saya Semua Mencetak Nilai Yang Sama Walaupun Menggunakan Slice in Go?

Mengapa Goroutine Saya Semua Mencetak Nilai Yang Sama Walaupun Menggunakan Slice in Go?

Susan Sarandon
Lepaskan: 2024-12-20 02:40:10
asal
861 orang telah melayarinya

Why Do My Goroutines All Print the Same Value Despite Using a Slice in Go?

Memahami Gelagat Goroutine dalam Perlumbaan Data

Coretan kod yang disediakan menunjukkan isu perlumbaan data klasik dalam Go. Walaupun matlamatnya adalah untuk mencetak nilai yang berbeza ("satu", "dua", "tiga") daripada senarai medan, hasil sebenar yang diperhatikan ialah "tiga" dicetak tiga kali.

Untuk menyelesaikan masalah ini isu, kita perlu memahami sebab dan tempat perlumbaan data berlaku.

Mengenal pasti Data Perlumbaan

Isunya terletak pada penilaian hujah fungsi goroutine. Apabila gelung berulang ke atas kepingan data, pembolehubah julat v diberikan kepada badan gelung dan digunakan dalam panggilan ke v.print(). Walau bagaimanapun, pembolehubah v ialah salinan elemen dan oleh kerana hirisan diubah semasa lelaran, goroutin akhirnya semua menghala ke elemen terakhir hirisan yang sama.

Ini bermakna apabila goroutin dilaksanakan, mereka semua mencetak nilai terakhir ("tiga") dan bukannya nilai unik ("satu", "dua", "tiga") yang kita dimaksudkan.

Mungkin Penyelesaian

Terdapat beberapa cara untuk menangani isu ini dan menghapuskan perlumbaan data:

  1. Buat Pembolehubah Baharu Di Dalam Gelung:

    • Oleh mengisytiharkan pembolehubah baharu v dalam gelung menggunakan sintaks v := v, kami memastikan setiap goroutine beroperasi pada salinan datanya sendiri.
  2. Gunakan Sekeping Petunjuk:

    • Daripada melepasi kepingan asal, kita boleh menggunakan sekeping penunjuk (cth., []*medan). Apabila dihantar ke goroutine, setiap penuding menghala ke elemen unik dalam kepingan, mengelakkan perlumbaan data.
  3. Pass Alamat Elemen Slice:

    • Sebagai alternatif, kita boleh secara eksplisit menghantar alamat setiap elemen kepingan kepada goroutine menggunakan sintaks &data[i]. Ini memastikan bahawa setiap goroutine mempunyai penunjuk unik kepada elemen yang dimaksudkan.
  4. Gunakan Fungsi Tanpa Nama dengan Argumen:

    • Jika fungsi goroutine berada dalam fungsi tanpa nama, kita boleh menghantar pembolehubah julat sebagai hujah kepada fungsi tanpa nama, mengasingkan akses goroutine kepada data.

Dengan menggunakan salah satu daripada penyelesaian ini, kami boleh menghapuskan perlumbaan data dan memastikan bahawa goroutine mencetak nilai unik yang dimaksudkan ("satu" , "dua", "tiga") dalam sebarang susunan.

Atas ialah kandungan terperinci Mengapa Goroutine Saya Semua Mencetak Nilai Yang Sama Walaupun Menggunakan Slice in Go?. 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