Dalam Go, penggunaan kata kunci tangguh membenarkan fungsi mempunyai kod dilaksanakan pada masa pengembaliannya, walaupun panik berlaku. Walau bagaimanapun, apabila ia melibatkan pembolehubah yang diisytiharkan dengan cara yang berbeza dalam fungsi, hasilnya boleh berbeza-beza, yang membawa kepada kekeliruan.
Pertimbangkan coretan kod berikut:
func c(i int) int { defer func() { i++ }() return i } func main() { fmt.Println(c(0)) // Prints 0 }
Dalam contoh ini, kami memanggil fungsi c dan memberikannya nilai 0. Walau bagaimanapun, apabila kami mencetak hasilnya, kami mendapat 0 daripada jangkaan 1. Ini kerana i diisytiharkan sebagai parameter input kepada fungsi. Sebaik sahaja pernyataan pulangan dilaksanakan, fungsi tangguh dipanggil, tetapi kenaikan tidak mempunyai kesan ke atas nilai pulangan.
Berbeza dengan contoh sebelumnya, mari kita pertimbangkan kod berikut:
func c1() (i int) { defer func() { i++ }() return i } func main() { fmt.Println(c1()) // Prints 1 }
Di sini, i diisytiharkan sebagai parameter hasil untuk fungsi c1. Apabila pernyataan pulangan dilaksanakan, nilai i ditetapkan kepada nilai pulangan. Walau bagaimanapun, fungsi tangguh masih dibenarkan untuk mengubah suai nilai i sebelum ia dikembalikan. Ini menyebabkan output ialah 1.
Untuk menggambarkan lebih lanjut tingkah laku ini, mari tambah satu lagi contoh:
func c2() (i int) { defer func() { i++ }() return 2 } func main() { fmt.Println(c2()) // Prints 3 }
Dalam contoh ini, pernyataan pulangan secara eksplisit menetapkan i kepada 2 sebelum fungsi tangguh dipanggil. Akibatnya, fungsi tangguh menambah nilai i dan nilai pulangan menjadi 3.
Pengambilan utama daripada contoh ini ialah perbezaan antara parameter input dan menamakan parameter hasil. Parameter input dihantar ke dalam fungsi, manakala parameter hasil dinamakan ialah pembolehubah yang memegang nilai pulangan fungsi. Fungsi tangguh boleh mengubah suai parameter hasil dinamakan selepas penyataan pulangan dilaksanakan, tetapi ia tidak boleh menjejaskan parameter input.
Atas ialah kandungan terperinci Mengapakah `menangguhkan` Mempengaruhi Nilai Pulangan Dinamakan Berbeza Daripada Parameter Input dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!