Bagaimanakah penangguhan berinteraksi dengan nilai pulangan yang dinamakan?
Dalam Go, kata kunci tangguh menangguhkan pelaksanaan fungsi sehingga fungsi sekeliling kembali . Dalam konteks nilai pulangan yang dinamakan, tingkah laku ini membenarkan fungsi tertunda untuk mengubah suai nilai yang akhirnya akan dikembalikan.
Pertimbangkan contoh berikut:
func c() (i int) { defer func() { i++ }() return 1 }
Dalam contoh ini, fungsi utama mengembalikan 1. Walau bagaimanapun, fungsi tertunda menambah nilai pulangan dinamakan i sebanyak 1 sebelum fungsi utama kembali. Akibatnya, nilai pulangan sebenar bagi fungsi utama ialah 2.
Tingkah laku ini mungkin kerana dalam Go, kembalikan pernyataan dengan argumen secara berkesan menetapkan nilai kepada pembolehubah pulangan yang dinamakan sebelum kembali. Oleh itu, penyata pulangan 1 adalah bersamaan dengan yang berikut:
i = 1 return
Akibatnya, fungsi tertunda boleh menetapkan kepada nilai pulangan yang dinamakan i dan mengubah suai nilai pulangan bagi fungsi sekeliling.
Adalah penting untuk ambil perhatian bahawa susunan penyata penangguhan adalah penting. Fungsi tertunda dilaksanakan dalam susunan Keluar-Masuk-Masuk-Dulu (LIFO). Ini bermakna fungsi tertunda yang terbaharu akan dilaksanakan terlebih dahulu selepas fungsi sekeliling kembali.
Untuk lebih memahami cara ini berfungsi, pertimbangkan contoh semakan berikut:
func c() (i int) { defer func() { fmt.Println("third") }() defer func() { i = 2 }() defer func() { fmt.Println("first") }() fmt.Println("second") return 1 }
Dalam contoh ini, susunan pelaksanaan adalah sebagai berikut:
Fungsi tertunda yang menetapkan i kepada 2 dilaksanakan sebelum fungsi kembali, jadi nilai pulangan ialah 2. Penyata fmt.Println dilaksanakan dalam susunan terbalik kerana kepada tingkah laku LIFO penangguhan.
Atas ialah kandungan terperinci Bagaimanakah Penyata `menangguhkan` Mempengaruhi Nilai Pulangan Dinamakan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!