Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menangani \"Menggunakan pembolehubah pada skop julat x dalam fungsi literal (scopelint)\" dalam Go?

Bagaimana untuk Menangani \"Menggunakan pembolehubah pada skop julat x dalam fungsi literal (scopelint)\" dalam Go?

Linda Hamilton
Linda Hamiltonasal
2024-10-26 23:24:30642semak imbas

How to Address

Menggunakan Pembolehubah Julat dalam Huruf Fungsi (scopelint)

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)".

Memahami Isu

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.

Penyelesaian: Menggunakan Salinan Pembolehubah

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!

Kenyataan:
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