> 백엔드 개발 > Golang > Go에서 defer 키워드는 어떻게 작동하며 이 코드 예제에서는 어떤 문제를 해결합니까?

Go에서 defer 키워드는 어떻게 작동하며 이 코드 예제에서는 어떤 문제를 해결합니까?

DDD
풀어 주다: 2024-10-31 16:20:02
원래의
699명이 탐색했습니다.

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

Go에서 Defer 키워드 작동 방식

Go에서 defer 키워드는 주변 함수가 반환될 때까지 함수 호출 실행을 연기하는 데 사용됩니다. defer문이 실행될 때 deferred 호출의 매개변수와 함수값은 평소와 같이 평가되지만, 실제 함수는 주변 함수의 return 문 직전에 호출됩니다.

평가 순서

평가 defer 키워드가 있는 명령문의 순서는 LIFO(후입선출) 방식을 따릅니다. 예를 들어 다음 코드를 고려해보세요.

<code class="go">defer func1()()
defer func2()()
fmt.Println("main function")</code>
로그인 후 복사

이 예에서는 func1()에 대한 호출이 연기되어 기본 함수가 반환되기 직전에 실행됩니다. 마찬가지로 func2() 호출은 func1() 호출 전에 연기되고 실행됩니다.

실제 예시

지연의 일반적인 사용 사례는 호출이 발생하기 전에 자동으로 리소스를 해제하는 것입니다. 함수가 반환됩니다. 예를 들어, 함수 시작 부분에서 파일 핸들을 열고 함수가 반환되기 전에 defer를 사용하여 닫을 수 있습니다.

기능 구현 연기

문제의 예를 고려하세요.

<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>
로그인 후 복사

이 코드에서는 getAge() 호출이 printTicket() 호출보다 지연됩니다. 이는 연령 평가 및 ticketPrice 계산이 즉시 발생하는 반면, 연령 및 티켓 가격의 실제 인쇄는 함수가 반환될 때까지 연기된다는 의미입니다.

defer를 사용하면 연령이 함수 실행 중 오류가 발생하더라도 항상 티켓 가격과 티켓 가격이 인쇄됩니다.

문제 해결

문제의 원본 코드에서는 printTicket 함수가 호출되지 않는 문제가 있었습니다. 이는 ticketPrice 변수가 선언되었지만 값이 할당되지 않았기 때문입니다. 연기를 사용하면 티켓 가격이 인쇄되기 전에 올바르게 계산되었는지 확인할 수 있습니다.

수정된 코드 버전은 다음과 같습니다.

<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>
로그인 후 복사

이 수정 사항을 사용하면 코드가 올바르게 계산됩니다. 사용자의 연령에 따른 티켓 가격을 인쇄하세요.

위 내용은 Go에서 defer 키워드는 어떻게 작동하며 이 코드 예제에서는 어떤 문제를 해결합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿