Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah kata kunci tangguh berfungsi dalam Go dan apakah masalah yang diselesaikan dalam contoh kod ini?

Bagaimanakah kata kunci tangguh berfungsi dalam Go dan apakah masalah yang diselesaikan dalam contoh kod ini?

DDD
Lepaskan: 2024-10-31 16:20:02
asal
682 orang telah melayarinya

How does the defer keyword work in Go and what problem does it solve in this code example?

Cara Kata Kunci Tangguh Berfungsi dalam Go

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.

Perintah Penilaian

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>
Salin selepas log masuk

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().

Contoh Dunia Sebenar

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.

Menangguhkan Pelaksanaan Ciri

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>
Salin selepas log masuk

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.

Penyelesaian Masalah

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>
Salin selepas log masuk

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!

sumber:php.cn
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan