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:
Buat Pembolehubah Baharu Di Dalam Gelung:
Gunakan Sekeping Petunjuk:
Pass Alamat Elemen Slice:
Gunakan Fungsi Tanpa Nama dengan Argumen:
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!