Rumah > pembangunan bahagian belakang > Golang > Mengapakah `menangguhkan` Mempengaruhi Nilai Pulangan Dinamakan Berbeza Daripada Parameter Input dalam Go?

Mengapakah `menangguhkan` Mempengaruhi Nilai Pulangan Dinamakan Berbeza Daripada Parameter Input dalam Go?

Barbara Streisand
Lepaskan: 2024-11-29 00:18:12
asal
574 orang telah melayarinya

Why Does `defer` Affect Named Return Values Differently Than Input Parameters in Go?

Memahami Kesan Penangguhan pada Pengisytiharan Pembolehubah dalam Go

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.

Misteri Peningkatan Yang Lenyap

Pertimbangkan coretan kod berikut:

func c(i int) int {
    defer func() { i++ }()
    return i
}

func main() {
    fmt.Println(c(0)) // Prints 0
}
Salin selepas log masuk

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.

Keajaiban Keputusan Dinamakan

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
}
Salin selepas log masuk

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.

Pulangan Eksplisit dan Pengubahsuaian Tertunda

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
}
Salin selepas log masuk

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.

Kuasa Parameter Hasil Dinamakan

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!

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