Bolehkah Pemulihan Panik Mengubah Suai Pembolehubah Setempat dalam Literal Fungsi?
Dalam Go, apabila bekerja dengan nilai pulangan yang dinamakan, anda boleh menggunakan pernyataan tangguh untuk mengubah suai nilai sebelum mengembalikannya. Walau bagaimanapun, tingkah laku ini tidak konsisten apabila menggunakan pembolehubah tempatan dalam literal fungsi.
Pertimbangkan kod berikut:
<code class="go">func foo() (result int, err error) { defer func() { if e := recover(); e != nil { result = -1 err = errors.New(e.(string)) } }() bar() result = 100 err = nil return } func bar() { panic("panic happened") }</code>
Kod ini berfungsi seperti yang diharapkan, menetapkan hasil kepada -1 dan tersilap kepada a mesej ralat tersuai selepas pulih daripada panik. Walau bagaimanapun, jika kita menggunakan pembolehubah tempatan dalam literal fungsi, tingkah laku berubah:
<code class="go">func foo() (int, error) { var result int var err error defer func() { if e := recover(); e != nil { result = -1 err = errors.New(e.(string)) } }() bar() result = 100 err = nil return result, err } func bar() { panic("panic happened") }</code>
Dalam kes ini, keputusan ditetapkan semula kepada 0 dan bukannya -1. Ini kerana pernyataan tangguh dalam literal fungsi tidak boleh mengakses atau mengubah suai nilai pulangan yang dinamakan kerana ia tidak lagi dalam skop.
Seperti dalam dokumentasi Go, "... jika fungsi tertunda ialah literal fungsi dan fungsi sekeliling telah menamakan parameter hasil yang berada dalam skop dalam literal, fungsi tertunda boleh mengakses dan mengubah suai parameter hasil sebelum ia dikembalikan."
Oleh itu, adalah penting untuk menggunakan nilai pulangan yang dinamakan apabila mencuba untuk mengubah suainya menggunakan pernyataan tangguh dalam literal fungsi. Pembolehubah setempat dalam kes sedemikian tidak boleh diakses atau diubah suai.
Atas ialah kandungan terperinci Bolehkah Pemulihan Panik Mengubah Suai Pembolehubah Setempat dalam Huruf Fungsi dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!