Dalam Go, kata kunci tangguh digunakan untuk menangguhkan pelaksanaan panggilan fungsi sehingga fungsi sekeliling kembali. Parameter dan nilai fungsi panggilan tertunda dinilai seperti biasa apabila penyataan penangguhan dilaksanakan, tetapi fungsi sebenar digunakan sejurus sebelum penyataan pemulangan fungsi sekeliling.
Penilaian susunan penyata dengan kata kunci tangguh mengikut pendekatan masuk terakhir, keluar dahulu (LIFO). Sebagai contoh, pertimbangkan kod berikut:
<code class="go">defer func1()() defer func2()() fmt.Println("main function")</code>
Dalam contoh ini, panggilan ke func1() akan ditangguhkan dan dilaksanakan serta-merta sebelum kembalinya fungsi utama. Begitu juga, panggilan ke func2() akan ditangguhkan dan dilaksanakan sebelum panggilan ke func1().
Kes penggunaan biasa untuk penangguhan ialah melepaskan sumber secara automatik sebelum fungsi kembali. Contohnya, pemegang fail boleh dibuka pada permulaan fungsi dan ditutup menggunakan defer sebelum fungsi kembali.
Pertimbangkan contoh dalam masalah:
<code class="go">defer fmt.Println("Your age is:", getAge(age)) // calls getAge defer fmt.Println("Your ticket price is:", printTicket(age, ticketprice)) // calls printTicket</code>
Dalam kod ini, panggilan ke getAge() ditangguhkan sebelum panggilan ke printTicket(). Ini bermakna penilaian umur dan pengiraan harga tiket akan berlaku serta-merta, manakala cetakan sebenar umur dan harga tiket akan ditangguhkan sehingga fungsi kembali.
Dengan menggunakan penangguhan, anda boleh memastikan umur dan harga tiket sentiasa dicetak, walaupun ralat berlaku semasa pelaksanaan fungsi.
Kod asal dalam masalah mempunyai masalah apabila fungsi printTicket tidak dipanggil dengan betul untuk umur lebih daripada 13 tahun. Ini adalah kerana pembolehubah harga tiket sedang diisytiharkan tetapi tidak pernah memberikan nilai. Dengan menggunakan penangguhan, kami boleh memastikan bahawa harga tiket dikira dengan betul sebelum ia dicetak.
Berikut ialah versi kod yang diperbetulkan:
<code class="go">package main import "fmt" func main() { var age int defer fmt.Println("Your age is:", getAge(&age)) defer fmt.Println("Your ticket price is:", printTicket(age)) } func printTicket(age int) float64 { var ticketPrice float64 switch { case age <= 13: ticketPrice = 9.99 case age > 13 && age < 65: ticketPrice = 19.99 case age >= 65: ticketPrice = 12.99 } return ticketPrice } func getAge(age *int) int { fmt.Println("What is your age?") fmt.Scan(age) for *age < 0 || *age > 100 { fmt.Println("That cannot be, please enter your age again") fmt.Scan(age) } return *age }</code>
Dengan pembetulan ini, kod akan betul cetak harga tiket berdasarkan umur pengguna.
Atas ialah kandungan terperinci Bagaimanakah kata kunci tangguh berfungsi dalam Go dan apakah masalah yang diselesaikan dalam contoh kod ini?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!