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) }
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)) }()
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!