Ralat Scopelint: Menggunakan Pembolehubah pada Skop Julat
Dalam fungsi ujian TestGetUID, kod tersebut menghadapi ralat yang dilaporkan oleh scopelint, yang memberi amaran terhadap menggunakan pembolehubah x daripada skop julat dalam literal fungsi.
Pertimbangkan baris kod berikut:
<code class="go">for _, x := range tests { t.Run(x.description, func(t *testing.T) { client := fake.NewSimpleClientset(x.objs...) actual := getUID(client, x.namespace) assert.Equal(t, x.expected, actual) }) }</code>
Ralat berkaitan dengan baris ini kerana x ialah pembolehubah gelung dalam lelaran gelung julat atas kepingan ujian. Scopelint mengesan bahawa x sedang digunakan dalam literal fungsi yang dihantar kepada t.Run(), yang boleh membawa kepada potensi isu jika literal fungsi digunakan selepas t.Run() telah kembali.
Sebab dan Amalan Terbaik
Isu timbul kerana pengkompil tidak dapat menjamin bahawa literal fungsi yang dicipta dan dihantar kepada t.Run() tidak akan dipanggil selepas t.Run() keluar. Jika literal fungsi dipanggil selepas t.Run() kembali, ia akan merujuk kepada pembolehubah x, yang mungkin telah ditimpa dengan nilai daripada lelaran gelung berikutnya.
Go vet menaikkan amaran ini kepada mengelakkan tingkah laku yang tidak diingini sedemikian, yang boleh mengakibatkan pepijat atau perlumbaan data jika literal fungsi dilaksanakan serentak dalam gorouti yang berbeza.
Amalan terbaik yang disyorkan dalam kes sedemikian adalah sama ada melepasi nilai daripada pembolehubah gelung kepada literal fungsi sebagai hujah atau untuk membuat salinan pembolehubah gelung dan rujuk kepada salinan dalam literal fungsi. Memandangkan tandatangan literal fungsi tidak boleh ditukar, penyelesaian yang disyorkan ialah mencipta salinan, contohnya:
<code class="go">x2 := x</code>
Selepas mengisytiharkan salinan ini, pengecam x dalam literal fungsi akan merujuk kepada salinan setempat, bukan pembolehubah gelung. Walaupun memberikan nama yang sama pada salinan mungkin kelihatan mengelirukan, ia jelas menunjukkan niat untuk menggunakan salinan.
Atas ialah kandungan terperinci ## Ralat Scopelint: Menggunakan Pembolehubah pada Skop Julat - Bagaimana Merujuk Selamat kepada Pembolehubah Gelung dalam Literal Fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!