Mengapakah nilai pembolehubah dalam program Go saya tidak betul?

王林
Lepaskan: 2023-06-09 17:55:37
asal
701 orang telah melayarinya

Apabila menulis program Go, kita sering menghadapi masalah hasil keluaran pembolehubah yang tidak betul. Kadang-kadang masalah ini menyebabkan orang ramai menggaru kepala dan tidak tahu bagaimana untuk menyelesaikannya. Artikel ini membincangkan mengapa nilai pembolehubah yang salah berlaku dan menyediakan beberapa penyelesaian.

  1. Isu skop pembolehubah

Dalam program Go, skop pembolehubah dikawal melalui pendakap kerinting {}. Jika anda mengisytiharkan pembolehubah dalam fungsi dan menetapkan nilainya kepada pembolehubah lain, tetapi pembolehubah lain digunakan di luar fungsi, nilainya tidak akan betul.

Sebagai contoh, atur cara berikut mempunyai masalah ini:

func main() {
    a := 1
    {
        a := 2
    }
    fmt.Println(a) // 输出为1
}
Salin selepas log masuk

Dalam atur cara ini, kami mengisytiharkan dua pembolehubah a. Skop pembolehubah pertama ialah keseluruhan fungsi utama, manakala skop pembolehubah kedua berada di dalam pendakap kerinting {}. Kami memberikan nilai kepada pembolehubah di dalam pendakap kerinting, tetapi apabila pembolehubah digunakan di luar fungsi, nilainya masih asal.

Penyelesaian: Jangan isytiharkan pembolehubah dengan nama yang sama dengan nama luar di dalam pendakap kerinting dalam.

  1. Isu concurrency

Go ialah bahasa yang menyokong pengaturcaraan serentak. Jika berbilang coroutine Go mengakses pembolehubah yang sama pada masa yang sama, dan sekurang-kurangnya satu coroutine sedang mengubah suai pembolehubah ini, maka masalah nilai pembolehubah yang salah akan berlaku.

Sebagai contoh, program berikut mempunyai masalah ini:

func main() {
    var wg sync.WaitGroup
    var mu sync.Mutex
    a := 1
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            mu.Lock()
            defer mu.Unlock()
            a++
            wg.Done()
        }()
    }
    wg.Wait()
    fmt.Println(a) // 输出可能是10,也可能是11
}
Salin selepas log masuk

Dalam atur cara ini, kami menggunakan kunci yang disediakan oleh pakej penyegerakan untuk melindungi pembolehubah a. Tetapi kami telah mendayakan 10 coroutine pada masa yang sama untuk mengubah suai pembolehubah a, yang akan membawa kepada nilai pembolehubah yang salah.

Penyelesaian: Gunakan mekanisme kunci yang disediakan oleh pakej penyegerakan atau gunakan saluran untuk menyelaraskan akses antara coroutine yang berbeza.

  1. Isu penukaran jenis

Dalam program Go, penukaran jenis adalah sangat biasa. Tetapi kadangkala penukaran jenis boleh menyebabkan nilai pembolehubah yang salah.

Sebagai contoh, atur cara berikut mempunyai masalah ini:

func main() {
    var a uint32 = 1
    var b uint64 = uint64(a)
    fmt.Println(b) // 输出为1,而不是4294967297
}
Salin selepas log masuk

Dalam atur cara ini, kami menukar pembolehubah integer tak bertanda 32-bit a menjadi pembolehubah jenis integer tak bertanda 64-bit. Tetapi kami menjangkakan bahawa nilai keluaran b hendaklah 4294967297, bukan 1.

Penyelesaian: Apabila melakukan penukaran jenis, pastikan jenis sasaran boleh menampung nilai jenis sumber. Di samping itu, apabila menukar jenis titik terapung kepada integer, perhatian harus diberikan kepada isu pembundaran.

Ringkasan

Artikel ini membincangkan sebab nilai pembolehubah tidak betul ​​berlaku dan menyediakan beberapa penyelesaian. Semasa menulis program Go, kita mesti memberi perhatian kepada skop pembolehubah, isu konkurensi dan isu penukaran jenis, untuk mengelakkan nilai pembolehubah yang salah.

Atas ialah kandungan terperinci Mengapakah nilai pembolehubah dalam program Go saya tidak betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan