Perlumbaan Data dalam Gelagat Goroutine
Coretan kod yang disediakan memperkenalkan isu perlumbaan data yang boleh membawa kepada hasil yang tidak dapat diramalkan. Isu teras berpunca daripada sifat Goroutines dan cara pembolehubah julat dihantar ke fungsi Goroutine.
Perlumbaan Data
Kod yang disediakan menggunakan julat gelung di atas kepingan data, dan untuk setiap lelaran, ia memulakan goroutine baharu untuk mencetak medan nama struct medan. Walau bagaimanapun, dalam setiap lelaran, pembolehubah julat v menunjuk kepada struktur data asas yang sama dalam kepingan data, yang merupakan rujukan.
Apabila gelung berkembang dan pembolehubah v berulang melalui kepingan data, nilainya berubah kepada tunjuk kepada elemen seterusnya. Ini bermakna apabila fungsi goroutine dilaksanakan, ia mempunyai nilai terakhir v, iaitu elemen terakhir dalam kepingan.
Oleh itu, pelaksanaan goroutine akan menghasilkan pencetakan medan nama bagi hanya elemen terakhir, "tiga," tiga kali bukannya "satu," "dua," "tiga" dalam mana-mana pesanan.
Penyelesaian
Untuk menyelesaikan isu ini, beberapa penyelesaian tersedia:
Buat Pembolehubah Baharu :
Gunakan Sekeping Penunjuk:
Gunakan Alamat Elemen Slice:
Pendekatan Tambahan
Atas ialah kandungan terperinci Mengapa Kod Goroutine Ini Menghasilkan Keputusan Yang Tidak Dijangka dan Bagaimana Perlumbaan Data Boleh Dielakkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!