Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah penangguhan berfungsi dengan parameter fungsi dalam Go?

Bagaimanakah penangguhan berfungsi dengan parameter fungsi dalam Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-04 03:49:02301semak imbas

How does defer work with function parameters in Go?

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!

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