«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как ключевое слово Defer в Go работает в порядке выполнения функций?

Как ключевое слово Defer в Go работает в порядке выполнения функций?

Опубликовано 6 ноября 2024 г.
Просматривать:731

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

Понимание функциональности ключевого слова defer в Go

При работе с Go понимание поведения ключевого слова defer имеет решающее значение. Это ключевое слово позволяет разработчикам отложить выполнение функции до тех пор, пока не вернется работа окружающей функции. Однако важно отметить, что значение и параметры функции оцениваются при выполнении оператора defer.

Пример: оценка порядка отсрочки

Чтобы проиллюстрировать это, рассмотрим следующее код:

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
}

В этом примере код выполняется в следующем порядке:

  1. имеющая функцию оценивается и возвращает функцию, которая принимает строку в качестве входных данных (порядок оценки: 1)
  2. fun функция оценивается с помощью «with Go». строка в качестве входных данных (порядок оценки: 2)
  3. fmt.Print("some ") выполняется (порядок оценки: 3)
  4. defer вызывает функцию funWithGo с результатом fun (порядок оценки: 4)

Применение принципа отсрочки

Чтобы решить проблему, упомянутую в исходном запросе, мы можем использовать ключевое слово defer, чтобы правильно распечатать цену билета на основе по введенному возрасту. Ниже приведена модифицированная версия кода:

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 

В этом измененном коде мы правильно используем ключевое слово defer, чтобы гарантировать, что возраст и цена билета будут напечатаны после выполнения соответствующих функций, решая первоначальную проблему.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3