Rumah >pembangunan bahagian belakang >Golang >Bagaimana Menggunakan Defer in Go Dengan Betul Apabila Berurusan dengan Menukar Pembolehubah Setempat?

Bagaimana Menggunakan Defer in Go Dengan Betul Apabila Berurusan dengan Menukar Pembolehubah Setempat?

Susan Sarandon
Susan Sarandonasal
2024-12-10 13:55:14180semak imbas

How to Correctly Use Defer in Go When Dealing with Changing Local Variables?

Tangguhkan Penjelasan Penggunaan: Mencetak Nilai Pembolehubah Akhir

Dalam Go, kata kunci tangguh membenarkan kami menjadualkan fungsi yang akan dilaksanakan sejurus sebelum fungsi sekeliling kembali. Walau bagaimanapun, jika fungsi tertunda menggunakan pembolehubah tempatan yang mungkin berubah dalam fungsi sekeliling, penjagaan khusus mesti diambil untuk memastikan nilai yang betul digunakan.

Pertimbangkan fungsi berikut:

func printNumbers() {
    var x int

    defer fmt.Println(x)

    for i := 0; i < 5; i++ {
        x++
    }
}

Mengikut spesifikasi bahasa, apabila pernyataan tangguh dilaksanakan, pembolehubah tempatan dinilai dan disimpan semula. Walau bagaimanapun, fungsi sebenar tidak digunakan sehingga kemudian. Dalam kes ini, apabila pernyataan penangguhan dilaksanakan, nilai x ialah 0, jadi 0 akan dicetak apabila fungsi tertunda dipanggil.

Untuk menyelesaikan isu ini, kita boleh menggunakan salah satu daripada beberapa pendekatan:

1. Dengan Fungsi Tanpa Nama:

defer func() { fmt.Println(x) }()

Ini menggunakan fungsi tanpa nama yang menangkap nilai semasa x. Apabila fungsi tanpa nama digunakan, ia akan menggunakan nilai yang ditangkap, walaupun x telah berubah dalam fungsi sekeliling.

2. Dengan Penunjuk:

var x int
defer Print(&x)

Kita boleh menggunakan penunjuk kepada x dan menangguhkan fungsi yang mencetak nilai yang ditunjuk. Ini berfungsi kerana nilai penunjuk dinilai apabila penyataan tangguh dilaksanakan, tetapi nilai petanda tidak dinilai sehingga fungsi tertunda dipanggil.

3. Dengan Jenis Tersuai:

type MyInt int
func (m *MyInt) String() string { return strconv.Itoa(int(*m)) }
var x MyInt
defer fmt.Println(&x)

Di sini, kami mencipta MyInt jenis tersuai yang melaksanakan antara muka fmt.Stringer, membolehkan kami menentukan cara nilai dicetak. Apabila &x dicetak, kaedah Rentetan akan dipanggil, mengembalikan perwakilan rentetan nilai yang ditunjuk.

4. Membungkus:

x := []int{0}
defer fmt.Println(x)

Membungkus pembolehubah dalam kepingan membolehkan kami menangguhkan fungsi yang mencetak kandungan kepingan. Deskriptor hirisan dinilai apabila penyataan tangguh dilaksanakan, tetapi tatasusunan asas tidak dinilai sehingga fungsi tertunda dipanggil.

Adalah penting untuk diingat bahawa pembolehubah yang digunakan dalam fungsi tertunda tidak seharusnya menjadi parameter bagi fungsi tertunda itu sendiri, kerana parameter dinilai apabila penyataan penangguhan dilaksanakan.

Atas ialah kandungan terperinci Bagaimana Menggunakan Defer in Go Dengan Betul Apabila Berurusan dengan Menukar Pembolehubah Setempat?. 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