Dalam Go, adalah amalan biasa untuk mentakrifkan literal fungsi dan menghantarnya kepada fungsi tertib lebih tinggi. Walau bagaimanapun, menggunakan pembolehubah julat dalam literal fungsi boleh menimbulkan kebimbangan mengenai skop pembolehubah.
Dalam coretan kod berikut:
<code class="go">func TestGetUID(t *testing.T) { namespace := "lkfm" expecteduid := "fake_uid" var tests = []struct { description string expected string namespace string objs []runtime.Object }{ {"PositiveScenario", expecteduid, namespace, []runtime.Object{simpleNamespace(namespace)}}, } 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>
Pemeriksa lint menimbulkan ralat: "Menggunakan pembolehubah pada skop julat x dalam fungsi literal (scopelint)".
Ralat berpunca daripada menggunakan pembolehubah gelung x dalam literal fungsi yang dihantar kepada t.Run(). Pengkompil tidak pasti sama ada fungsi literal akan dipanggil selepas t.Run() kembali. Jika ya, fungsi literal akan merujuk kepada pembolehubah gelung, yang berpotensi ditimpa dengan nilai daripada lelaran seterusnya.
Untuk menyelesaikan isu, ubah suai kod untuk menghantar nilai pembolehubah gelung kepada fungsi literal atau mencipta salinannya. Oleh kerana tandatangan fungsi telah ditetapkan, buat salinan pembolehubah seperti berikut:
<code class="go">x2 := x</code>
Kemudian, rujuk kepada x2 dalam literal fungsi. Ini akan memuaskan penyemak lint.
Sebagai alternatif, memandangkan niat untuk membuat salinan adalah jelas, nama yang sama boleh digunakan untuk kedua-dua salinan dan pembolehubah gelung:
<code class="go">x := x</code>
Ini akan membayangi pembolehubah gelung dan menjadikannya setempat kepada fungsi literal.
Atas ialah kandungan terperinci Bagaimana untuk Menangani \'Menggunakan pembolehubah pada skop julat x dalam fungsi literal (scopelint)\' dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!