Mengapa Mengukur Masa Pelaksanaan Fungsi Tertunda dalam Go Mengembalikan Keputusan Yang Tidak Dijangka?

Barbara Streisand
Lepaskan: 2024-11-20 11:47:51
asal
827 orang telah melayarinya

Why Does Measuring Deferred Function Execution Time in Go Return Unexpected Results?

Mengukur Masa Pelaksanaan Fungsi dengan Fungsi Tertunda dalam Go

Dalam Go, fungsi tertunda menyediakan mekanisme yang mudah untuk menangguhkan pelaksanaan fungsi sehingga fungsi sekeliling kembali. Walau bagaimanapun, mencetak masa yang diambil untuk melaksanakan fungsi tertunda kadangkala mengembalikan hasil yang tidak dijangka.

Isu:

Pertimbangkan fungsi sum() berikut yang cuba mengira masa pelaksanaan menggunakan fungsi tertunda:

func sum() {
    start := time.Now()

    //Expecting to print non-zero value but always gets 0
    defer fmt.Println(time.Now().Sub(start))

    sum := 0
    for i := 1; i < 101; i++ {
        sum += i
    }
    time.Sleep(1 * time.Second)
    fmt.Println(sum)
}
Salin selepas log masuk

Menjalankan kod ini menyebabkan pencetakan 0 untuk masa pelaksanaan.

Penyelesaian:

Isu timbul kerana hujah kepada fungsi tertunda dinilai apabila fungsi itu ditangguhkan, bukan apabila ia dilaksanakan. Untuk membetulkannya, gunakan fungsi tanpa nama untuk menangkap nilai permulaan semasa dan menangguhkan pelaksanaan fungsi tanpa nama itu:

defer func() { fmt.Println(time.Now().Sub(start)) }()
Salin selepas log masuk

Dengan menggunakan fungsi tanpa nama, nilai mula dinilai pada masa tertunda fungsi dilaksanakan.

Pertimbangan Selanjutnya:

Jika anda memerlukan lebih penyesuaian atau fleksibiliti, pertimbangkan untuk merangkum logik pemasaan dalam fungsi boleh guna semula. Pendekatan ini menyediakan penyelesaian yang lebih modular dan boleh diguna semula.

Atas ialah kandungan terperinci Mengapa Mengukur Masa Pelaksanaan Fungsi Tertunda dalam Go Mengembalikan Keputusan Yang Tidak Dijangka?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan