Go의 클로저 본문 괄호
Go에서는 클로저 본문 뒤의 괄호 사용법을 이해하기 어려울 수 있습니다. 두 가지 예를 검토하여 이 개념을 더 자세히 살펴보겠습니다.
함수 리터럴:
함수 리터럴 예에서:
func(ch chan int) { ch <- ACK }(replyChan)
괄호는 즉시 클로저 본문(replyChan) 뒤에 함수 리터럴을 호출하고 replyChan 인수를 전달합니다.
Defer 문:
defer 문 예에서:
func f() (result int) { defer func() { result++ }() // why and how? return 0 }
클로저 본문 뒤의 괄호()는 다음과 같습니다. 클로저에만 관련된 것은 아니지만 defer 문 구문의 일부입니다. Go 언어 사양에 따르면 defer 문의 표현식은 항상 함수 호출이어야 합니다. 따라서 클로저가 즉시 호출된다는 것을 나타내기 위해 괄호가 필요합니다.
함수 호출 구문의 중요성:
Go에서는 함수 간에 뚜렷한 차이가 있습니다. 값과 함수 호출. 함수 값은 실제 함수 정의를 참조하고 함수 호출은 함수 실행을 나타냅니다.
다음 코드를 고려하세요.
func f() int { return 42 } a := f // function value b := f() // function call
첫 번째 줄에서 a에는 f의 함수 값, 두 번째 줄에서는 b에 f를 호출한 결과가 할당됩니다.
마찬가지로 defer 문에서 표현식은 다음과 같아야 합니다. 단순한 함수 값이 아닌 함수 호출. 따라서 함수 호출을 나타내려면 괄호가 필요합니다.
추가 참고:
괄호는 빈 목록을 포함한 표현식 목록을 포함할 수도 있습니다. 이 구별은 클로저가 실행되는 시기와 인수를 결정하기 때문에 중요합니다.
위 내용은 Go Closure 본문 뒤에 언제 괄호가 필요합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!