Rasional Di Sebalik "( )" dalam Badan Penutupan dalam Go
In Go, penambahan "( )" selepas badan penutup tidak khusus untuk penutupan tetapi terpakai pada sebarang panggilan fungsi dalam kenyataan penangguhan. Spesifikasi bahasa memberi mandat bahawa ungkapan dalam pernyataan tangguh mestilah sentiasa panggilan fungsi.
Pertimbangkan contoh:
defer f()
Ungkapan ini cuba menangguhkan pelaksanaan fungsi f itu sendiri, yang tidak masuk akal. Sebaliknya, sintaks yang betul ialah:
defer f()()
Ini membina penutupan yang menangkap konteks semasa dan melaksanakan fungsi f apabila pernyataan tangguh diaktifkan. Tanda kurung luar melaksanakan penutupan serta-merta, memastikan bahawa panggilan fungsi berlaku selepas pernyataan tangguh dilaksanakan.
Sintaks ini konsisten dengan penggunaan umum panggilan fungsi dalam Go, yang sentiasa memerlukan kurungan untuk melaksanakannya. Sebagai contoh, untuk mencetak nilai i pada masa penutupan ditakrifkan, gunakan sintaks berikut:
defer func(n int) { fmt.Println(n) }(i)
Sebaliknya, untuk mencetak nilai i pada masa penutupan dilaksanakan, gunakan:
defer func() { fmt.Println(i) }()
Memahami prinsip ini membolehkan pemahaman yang jelas tentang kelakuan penyataan penangguhan dalam Go dan penggunaan "( )" yang betul dalam badan penutup dan seterusnya.
Atas ialah kandungan terperinci Mengapa Gunakan '( )' Badan Selepas Penutupan dalam Penyata `tunda` Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!