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