Rumah pembangunan bahagian belakang Golang Apakah hubungan antara tangguh dan panik dalam bahasa Go?

Apakah hubungan antara tangguh dan panik dalam bahasa Go?

Jun 11, 2023 am 09:00 AM
pergi bahasa defer panic

Bahasa Go ialah bahasa pengaturcaraan baharu yang telah menambahkan beberapa sintaks dan ciri unik, antaranya tangguh dan panik ialah dua ciri yang sangat penting. Artikel ini akan memperkenalkan hubungan antara tangguh dan panik dalam bahasa Go serta penggunaan dan cirinya.

Penggunaan penangguhan

Pernyataan penangguhan dalam bahasa Go digunakan untuk mendaftarkan fungsi Apabila pelaksanaan fungsi ini tamat atau skop semasa tamat, fungsi yang didaftarkan akan dilaksanakan secara automatik. tangguh boleh digunakan dalam berbilang senario seperti pelepasan sumber, buka kunci dan pengendalian ralat.

Berikut ialah contoh sumber pelepasan tangguh:

func main() {
    file, err := os.Open("myfile.txt")
  // 在函数结束时,会自动关闭文件
    defer file.Close()
  
    if err != nil {
        fmt.Println("Failed to open file.")
        return
    }
    // ...
}
Salin selepas log masuk

didaftarkan melalui fungsi Tutup() bagi fail tangguh, dan fail akan ditutup secara automatik apabila pelaksanaan fungsi tamat.

Berikut ialah contoh membuka kunci kunci tangguh:

func main() {
    var lock sync.Mutex
    lock.Lock()
  // 当函数执行结束时,会自动解锁
    defer lock.Unlock()
  
    // ...
}
Salin selepas log masuk

Fungsi Unlock() akan dipanggil secara automatik untuk membuka kunci apabila pelaksanaan fungsi tamat.

Arahan pelaksanaan penangguhan adalah dari belakang ke hadapan, yang bermaksud bahawa jika beberapa penyata penangguhan didaftarkan, ia akan dilaksanakan dalam susunan terbalik. Contoh berikut akan mengeluarkan Defer 2, kemudian Defer 1.

func main() {
    defer fmt.Println("Defer 1")
    defer fmt.Println("Defer 2")
    fmt.Println("Hello")
}
Salin selepas log masuk

Penggunaan panik

Kata kunci panik dalam bahasa Go digunakan untuk membuang pengecualian dan menamatkan pelaksanaan fungsi atau program semasa. Panik akan menyebarkan timbunan panggilan fungsi sehingga ia ditangkap oleh fungsi recover(). Jika tidak ditangkap, keseluruhan program akan keluar dan timbunan panggilan dicetak.

Dalam kod contoh berikut, apabila panjang rentetan input kurang daripada 5, panik akan dicetuskan dan pelaksanaan program akan ditamatkan. Output

func hello(name string) {
    if len(name) < 5 {
        panic("Name is too short.")
    }
    fmt.Println("Hello", name)
}

func main() {
    hello("Tom")
    hello("Bob")
    hello("me")
}
Salin selepas log masuk

adalah seperti berikut:

Hello Tom
Hello Bob
panic: Name is too short.

goroutine 1 [running]:
main.hello(...)
    /Users/user/goland/src/main.go:4
main.main()
    /Users/user/goland/src/main.go:10 +0x81
exit status 2
Salin selepas log masuk

Di sini kita dapat melihat bahawa apabila nama input ialah me, panik akan dicetuskan dan pelaksanaan program akan ditamatkan.

Hubungan antara penangguhan dan panik

panik memainkan peranan untuk menamatkan pelaksanaan program dengan serta-merta, yang bermaksud ia boleh dicetuskan pada bila-bila masa, termasuk sebelum tamat pelaksanaan fungsi. Untuk memastikan program boleh mengeluarkan sumber dalam masa dan melaksanakan beberapa kerja pembersihan yang diperlukan, bahasa Go memperkenalkan mekanisme penangguhan, yang membolehkan fungsi melakukan beberapa operasi pembersihan sebelum keluar.

Apabila panik dicetuskan dalam fungsi, ia akan keluar serta-merta dan melaksanakan semua fungsi tangguh yang didaftarkan sebelum fungsi semasa. Kod contoh berikut secara manual mencetuskan panik dan melaksanakan fungsi tangguh dua kali sebelum keluar.

func main() {
    defer fmt.Println("Defer 1")
    defer fmt.Println("Defer 2")
    
    panic("Oops! Something went wrong.")
}
Salin selepas log masuk

Output adalah seperti berikut:

Defer 2
Defer 1
panic: Oops! Something went wrong.

goroutine 1 [running]:
main.main()
    /Users/user/goland/src/main.go:7 +0x81
exit status 2
Salin selepas log masuk

Kita dapat melihat bahawa selepas mencetuskan panik, kedua-dua fungsi penangguhan dilaksanakan dalam susunan terbalik.

Selain mendaftarkan fungsi penangguhan pada penghujung fungsi, bahasa Go juga membenarkan berbilang fungsi penangguhan didaftarkan dalam fungsi tersebut. Ini bermakna jika terdapat berbilang fungsi penangguhan dalam fungsi, walaupun salah satu penangguhan mencetuskan panik, fungsi penangguhan yang lain masih boleh dilaksanakan.

Kod contoh berikut menunjukkan bahawa apabila fungsi mendaftarkan beberapa pernyataan penangguhan, salah satu fungsi penangguhan mencetuskan panik, tetapi fungsi penangguhan yang lain masih dilaksanakan.

func init() {
    fmt.Println("Init 1")
}

func init() {
    fmt.Println("Init 2")
}

func main() {
    defer fmt.Println("Defer 1")
    
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("Recovered:", err)
        }
    }()
    
    defer fmt.Println("Defer 2")
    
    panic("Oops! Something went wrong.")
}
Salin selepas log masuk

Hasil keluaran adalah seperti berikut:

Init 1
Init 2
Defer 2
Recovered: Oops! Something went wrong.
Defer 1
Salin selepas log masuk

Kita dapat melihat bahawa fungsi itu mula-mula melaksanakan dua fungsi init, dan kemudian melaksanakan tiga fungsi tangguh dalam urutan. Apabila salah satu penangguhan mencetuskan panik, tetapi ditangkap oleh penangguhan yang lain dan program disambung semula, akhirnya kedua-dua fungsi penangguhan dilaksanakan secara normal.

Dalam pembangunan sebenar, penangguhan dan panik sering digunakan secara berpasangan, penangguhan digunakan untuk melepaskan sumber dan melakukan operasi pembersihan, dan panik digunakan untuk mengendalikan pengecualian. Apabila fungsi perlu melakukan beberapa operasi pembersihan sebelum keluar, kita boleh menggunakan fungsi pembungkus tangguh pada permulaan fungsi dan menggunakan fungsi recover() untuk menghalang fungsi daripada keluar awal. Cara penulisan ini sangat biasa dan memberikan jaminan yang kukuh untuk kami menulis program yang mantap.

Atas ialah kandungan terperinci Apakah hubungan antara tangguh dan panik dalam bahasa Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Perpustakaan apa yang digunakan untuk operasi nombor terapung di GO? Perpustakaan apa yang digunakan untuk operasi nombor terapung di GO? Apr 02, 2025 pm 02:06 PM

Perpustakaan yang digunakan untuk operasi nombor terapung dalam bahasa Go memperkenalkan cara memastikan ketepatannya ...

Apakah masalah dengan thread giliran di crawler colly go? Apakah masalah dengan thread giliran di crawler colly go? Apr 02, 2025 pm 02:09 PM

Masalah Threading Giliran di GO Crawler Colly meneroka masalah menggunakan Perpustakaan Colly Crawler dalam bahasa Go, pemaju sering menghadapi masalah dengan benang dan permintaan beratur. � ...

Perpustakaan mana yang dibangunkan oleh syarikat besar atau disediakan oleh projek sumber terbuka yang terkenal? Perpustakaan mana yang dibangunkan oleh syarikat besar atau disediakan oleh projek sumber terbuka yang terkenal? Apr 02, 2025 pm 04:12 PM

Perpustakaan mana yang dibangunkan oleh syarikat besar atau projek sumber terbuka yang terkenal? Semasa pengaturcaraan di GO, pemaju sering menghadapi beberapa keperluan biasa, ...

Apakah perbezaan antara struktur definisi kata kunci `var` dan` type` dalam bahasa Go? Apakah perbezaan antara struktur definisi kata kunci `var` dan` type` dalam bahasa Go? Apr 02, 2025 pm 12:57 PM

Dua cara untuk menentukan struktur dalam bahasa Go: perbezaan antara VAR dan jenis kata kunci. Apabila menentukan struktur, pergi bahasa sering melihat dua cara menulis yang berbeza: pertama ...

Di Go, mengapa rentetan percetakan dengan fungsi println dan rentetan () mempunyai kesan yang berbeza? Di Go, mengapa rentetan percetakan dengan fungsi println dan rentetan () mempunyai kesan yang berbeza? Apr 02, 2025 pm 02:03 PM

Perbezaan antara percetakan rentetan dalam bahasa Go: perbezaan kesan menggunakan fungsi println dan rentetan () sedang ...

Bagaimana menyelesaikan masalah penukaran jenis user_id semasa menggunakan aliran redis untuk melaksanakan beratur mesej dalam bahasa Go? Bagaimana menyelesaikan masalah penukaran jenis user_id semasa menggunakan aliran redis untuk melaksanakan beratur mesej dalam bahasa Go? Apr 02, 2025 pm 04:54 PM

Masalah menggunakan redisstream untuk melaksanakan beratur mesej dalam bahasa Go menggunakan bahasa Go dan redis ...

Apa yang perlu saya lakukan jika label struktur tersuai di Goland tidak dipaparkan? Apa yang perlu saya lakukan jika label struktur tersuai di Goland tidak dipaparkan? Apr 02, 2025 pm 05:09 PM

Apa yang perlu saya lakukan jika label struktur tersuai di Goland tidak dipaparkan? Apabila menggunakan Goland untuk Pembangunan Bahasa GO, banyak pemaju akan menghadapi tag struktur tersuai ...

Kenapa perlu lulus petunjuk apabila menggunakan perpustakaan Go dan Viper? Kenapa perlu lulus petunjuk apabila menggunakan perpustakaan Go dan Viper? Apr 02, 2025 pm 04:00 PM

GO Pointer Syntax dan menangani masalah dalam penggunaan perpustakaan Viper semasa pengaturcaraan dalam bahasa Go, adalah penting untuk memahami sintaks dan penggunaan petunjuk, terutama dalam ...

See all articles