Memahami selok-belok "tunda" dalam Go
Tunda dalam Go ialah kata kunci berkuasa yang membolehkan anda menangguhkan pelaksanaan fungsi panggil sehingga fungsi lampiran kembali. Walau bagaimanapun, apabila bekerja dengan penangguhan, adalah penting untuk memahami susunan penilaian parameter fungsi dan nilai pulangan.
Perintah Penilaian dan Tangguh
Menurut dokumentasi mengenai Defer_statements, setiap kali pernyataan "menangguhkan" dilaksanakan,"nilai fungsi dan parameter kepada panggilan dinilai seperti biasa dan disimpan semula tetapi fungsi sebenar tidak digunakan." Ini bermakna apabila anda memanggil fungsi tertunda, parameter fungsi dinilai dahulu, dan kemudian fungsi sebenar digunakan semasa pemulangan fungsi.
Senario
Mari kita teliti menjadi contoh khusus di mana anda menghadapi masalah mendapatkan harga tiket untuk mengira dengan betul berdasarkan umur pengguna. Kod anda mentakrifkan panggilan tertunda untuk mencetakTicket dengan hujah ticketPrice. Anda menjangkakan Harga tiket ditetapkan mengikut umur yang disediakan dan mengembalikan harga tiket yang sesuai.
Isunya
Masalah timbul kerana anda cuba lulus "Harga tiket" yang tidak dimulakan untuk mencetakTiket. Apabila panggilan tertunda untuk mencetakTiket dilaksanakan semasa pemulangan utama, "Harga tiket" yang tidak dimulakan akan menghasilkan nilai sifar lalai, menyebabkan hanya harga 9.99 dicetak.
Penyelesaian
Untuk menyelesaikan masalah ini, anda harus memulakan "harga tiket" kepada nilai yang betul sebelum menangguhkan panggilan untuk mencetakTiket. Sebagai alternatif, anda boleh menggunakan sintaks panggilan fungsi yang diubah suai yang membolehkan anda menghantar "ticketPrice" dengan rujukan, memastikan panggilan tertunda mendapat nilai yang dikemas kini.
Contoh
Berikut ialah versi kod anda yang diubah suai yang menunjukkan penggunaan penangguhan yang betul:
<code class="go">package main import "fmt" func printTicket(age int) float64 { fmt.Println("...order is 2...") switch { case age <= 13: return 9.99 case age > 13 && age < 65: return 19.99 default: return 12.99 } } func main() { var age int defer fmt.Println("...order is 4...Your age is:", getAge(&age)) // Modify the calling syntax here: var ticketPrice = 0.0 defer fmt.Println("...order is 3...Your ticket price is:", printTicket(age, &ticketPrice)) } func getAge(age *int) int { fmt.Println("...order is 1...") fmt.Print("Enter age=") fmt.Scanln(age) return *age }</code>
Dengan pengubahsuaian ini, pembolehubah "ticketPrice" akan dimulakan dengan betul sebelum panggilan "printTicket", memastikan harga tiket yang betul dikira dan dicetak.
Atas ialah kandungan terperinci Bagaimanakah penangguhan berfungsi dengan parameter fungsi dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!