"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como funciona a palavra-chave defer do Go na ordem de execução da função?

Como funciona a palavra-chave defer do Go na ordem de execução da função?

Publicado em 2024-11-06
Navegar:884

How Does Go\'s Defer Keyword Work in Function Execution Order?

Compreendendo a funcionalidade da palavra-chave defer do Go

Ao trabalhar com Go, compreender o comportamento da palavra-chave defer é crucial. Esta palavra-chave permite aos desenvolvedores adiar a execução de uma função até que a função circundante retorne. No entanto, é importante observar que o valor e os parâmetros da função são avaliados quando a instrução defer é executada.

Exemplo: avaliando a ordem de defer

Para ilustrar isso, considere o seguinte código:

package main

import "fmt"

func main() {
    defer having()(fun("with Go."))
    fmt.Print("some ") // evaluation order: 3
}

func having() func(string) {
    fmt.Print("Go ") // evaluation order: 1
    return funWithGo
}

func fun(msg string) string {
    fmt.Print("have ") // evaluation order: 2
    return msg
}

func funWithGo(msg string) {
    fmt.Println("fun", msg) // evaluation order: 4
}

Neste exemplo, o código é executado na seguinte ordem:

  1. ter função é avaliada e retorna uma função que recebe uma string como entrada (ordem de avaliação: 1)[ A função &&&]
  2. fun é avaliada com o "with Go". string como entrada (ordem de avaliação: 2)
  3. fmt.Print("some ") é executada (ordem de avaliação: 3)
  4. defer chama a função funWithGo com o resultado de fun (ordem de avaliação: 4)

Aplicando o Princípio Defer

Para resolver o problema mencionado na consulta original, podemos usar a palavra-chave defer para imprimir corretamente o preço do ingresso com base na idade inserida. Abaixo está uma versão modificada do código:

package main

import "fmt"

func main() {
    age := 999
    defer fmt.Println("Your age is:", getAge(&age)) // defer printing the age
    defer fmt.Println("Your ticket price is:", getTicketPrice(age)) // defer printing the ticket price
}

func getTicketPrice(age int) float64 {
    // Calculate ticket price based on age
    // logic can be customized here
    fmt.Println("...order is 2...")
    switch {
    case age  13 && age Neste código modificado, aproveitamos corretamente a palavra-chave defer para garantir que a idade e o preço do ingresso sejam impressos após a execução das respectivas funções, resolvendo o problema inicial.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3