> 백엔드 개발 > Golang > 내 연기 명세서가 Go에서 예상 티켓 가격을 산출하지 못하는 이유는 무엇입니까?

내 연기 명세서가 Go에서 예상 티켓 가격을 산출하지 못하는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2024-10-30 18:30:18
원래의
398명이 탐색했습니다.

Why Does My Defer Statement Not Produce the Expected Ticket Price in Go?

Go에서 defer 키워드 작동 방식

Go에서 defer 키워드를 사용하면 함수나 명령문의 실행을 주변 환경까지 지연할 수 있습니다. 함수가 반환됩니다. 그러나 지연된 함수의 값과 매개변수는 즉시 평가되어 defer 문 시점의 함수 호출에 바인딩됩니다.

지연 평가 순서 이해

예를 들어, 다음 코드는

defer fmt.Println("Your age is:", getAge(age))
로그인 후 복사

fmt.Println 함수의 실행을 연기하고 defer 문이 실행될 때 age 값을 바인딩합니다. 그러나 실제 fmt.Println 함수 호출은 주변 함수가 반환되기 직전에 역순으로 실행됩니다.

티켓 가격 계산에 적용

귀하의 경우에는 사용자의 연령을 기준으로 티켓 가격을 계산하려고 합니다.

defer fmt.Println("Your ticket price is:", printTicket(age, ticketPrice))
로그인 후 복사

여기에서 defer 문은 defer 문 당시의 age 및 ticketPrice 값을 바인딩합니다. 기본 함수가 반환되면 printTicket은 age 및 ticketPrice의 바인딩된 값으로 호출됩니다. 그러나 연령 <= 13에 대한 if 문만 실행되므로 9.99만 인쇄됩니다.

문제 해결

문제를 해결하려면 다음 사항을 확인하세요. printTicket의 모든 필수 조건은 함수가 연기되기 전에 평가됩니다. 다음은 수정된 버전입니다.

defer fmt.Println(*age)

if *age <= 13 {
    ticketPrice = 9.99
} else if *age > 13 && *age < 65 {
    ticketPrice = 19.99
} else if *age >= 65 {
    ticketPrice = 12.99
}
defer fmt.Println(ticketPrice)

이제 fmt.Println(*age) 및 fmt.Println(ticketPrice)가 모두 연기되고 역순으로 실행되어 올바른 연령과 티켓 가격이 표시됩니다.

위 내용은 내 연기 명세서가 Go에서 예상 티켓 가격을 산출하지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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