>백엔드 개발 >Golang >Go의 Defer 키워드는 함수 실행 순서에서 어떻게 작동하나요?

Go의 Defer 키워드는 함수 실행 순서에서 어떻게 작동하나요?

Susan Sarandon
Susan Sarandon원래의
2024-10-29 20:32:031051검색

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

Go의 Defer 키워드 기능 이해

Go를 사용할 때 defer 키워드의 동작을 이해하는 것이 중요합니다. 이 키워드를 사용하면 개발자는 주변 함수가 반환될 때까지 함수 실행을 연기할 수 있습니다. 그러나 defer 문이 실행될 때 함수의 값과 매개 변수가 평가된다는 점에 유의하는 것이 중요합니다.

예: Defer Order 평가

이를 설명하려면 다음을 고려하세요. 코드:

<code class="go">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
}</code>

이 예에서 코드는 다음 순서로 실행됩니다.

  1. 갖는 함수가 평가되고 문자열을 입력으로 사용하는 함수를 반환합니다(평가 순서 : 1)
  2. 재미있는 기능은 "with Go"로 평가합니다. 문자열을 입력으로 사용(평가 순서: 2)
  3. fmt.Print("some ")가 실행됩니다(평가 순서: 3)
  4. fun의 결과로 funWithGo 함수 호출 연기(평가 순서: 4)

Defer 원칙 적용

원래 쿼리에서 언급된 문제를 해결하려면 defer 키워드를 사용하여 티켓 가격을 기반으로 올바르게 인쇄할 수 있습니다. 입력한 나이에 다음은 코드의 수정된 버전입니다.

<code class="go">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:
        return 9.99
    case age > 13 && age < 65:
        return 19.99
    default:
        return 12.99
    }
}

func getAge(age *int) int {
    fmt.Println("...order is 1...")
    fmt.Print("Enter age=")
    fmt.Scanln(age)
    return *age
}</code>

이 수정된 코드에서는 defer 키워드를 올바르게 활용하여 해당 기능이 실행된 후 연령과 티켓 가격이 인쇄되도록 하여 초기 문제를 해결했습니다. .

위 내용은 Go의 Defer 키워드는 함수 실행 순서에서 어떻게 작동하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.