Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Penyata `menangguhkan` Mempengaruhi Nilai Pulangan Dinamakan dalam Go?

Bagaimanakah Penyata `menangguhkan` Mempengaruhi Nilai Pulangan Dinamakan dalam Go?

Patricia Arquette
Patricia Arquetteasal
2024-12-02 05:38:131013semak imbas

How Do `defer` Statements Affect Named Return Values in Go?

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:

  1. fmt.Println("second")
  2. kembali 1
  3. i = 2
  4. fmt.Println("first")
  5. fmt.Println("third")

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!

Kenyataan:
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