Tunda penyataan menunggu penyiapan fungsi sebelum melaksanakan fungsi yang berkaitan. Walau bagaimanapun, mencetak masa pelaksanaan fungsi berikut menggunakan penangguhan sentiasa menghasilkan sifar:
func sum() { start := time.Now() // Expected 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) }
Isu:
tunda menilai argumen fungsi tertunda apabila fungsi yang mengandungi menangguhkannya . Oleh itu, mula dinilai serta-merta, sebelum gelung atau tidur.
Penyelesaian:
Untuk mengukur masa berlalu dengan tepat, nilai masa.Now() di dalam fungsi tertunda:
defer func() { fmt.Println(time.Now().Sub(start)) }()
Dengan berbuat demikian, perbezaan masa dikira apabila fungsi tertunda dilaksanakan, memastikan ketepatan hasil.
Petua: Pertimbangkan untuk menggunakan fungsi boleh guna semula untuk merangkum logik pemasaan untuk pengukuran yang lebih mudah dan konsisten.
Atas ialah kandungan terperinci Mengapa Mengukur Masa Pelaksanaan dengan Penangguhan Masuk Sentiasa Menghasilkan Sifar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!