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 중국어 웹사이트의 기타 관련 기사를 참조하세요!