Go에서 중첩 된 함수 선언 (함수 내부 함수)을 허용하지 않는 이유는 무엇입니까?
편집 : 내가 묻는 것이 명확하지 않은 경우 : 중첩 된 함수 선언을 허용하지 않음으로써 완화되는 문제는 무엇입니까?
Lambda는 예상대로 작동합니다.
func main() {
inc := func(x int) int { return x+1; }
}
그러나 선언 내부의 다음 선언은 허용되지 않습니다.
func main() {
func inc(x int) int { return x+1; }
}
중첩 함수가 허용되지 않는 이유는 무엇입니까?
이 명백한 기능이 허용되지 않는 3 가지 이유가 있다고 생각합니다.
- 컴파일러를 약간 복잡하게 만들 것입니다. 현재 컴파일러는 모든 함수가 최상위 수준에 있음을 알고 있습니다.
- 새로운 종류의 프로그래머 오류가 발생합니다. 무언가를 리팩터링하고 실수로 일부 함수를 중첩 할 수 있습니다.
- 함수와 클로저에 대해 다른 구문을 갖는 것은 좋은 일입니다. 클로저를 만드는 것은 함수를 만드는 것보다 잠재적으로 더 비싸므로 당신이 그것을하고 있다는 것을 알아야합니다.
그건 내 의견 일뿐입니다. 언어 디자이너의 공식적인 발표를 보지 못했습니다.
물론입니다. 변수에 할당하기 만하면됩니다.
func main() {
inc := func(x int) int { return x+1; }
}
모든 언어는 참신한 기능을 포함하고 있으며 누군가가 좋아하는 기능을 생략합니다. Go는 프로그래밍의 정확성, 컴파일 속도, 개념의 직교성, 동시성 및 가비지 수집과 같은 기능을 지원해야하는 필요성을 고려하여 설계되었습니다. 적합하지 않거나, 컴파일 속도 나 디자인의 명확성에 영향을 미치거나 기본 시스템 모델을 너무 어렵게 만들기 때문에 좋아하는 기능이 누락 될 수 있습니다.
Go에 기능 X가 누락되어 귀찮다면 Google을 용서하고 Go의 기능을 조사하십시오. X의 부족을 흥미로운 방식으로 보상한다는 것을 알 수 있습니다.
중첩 함수 추가의 복잡성과 비용을 정당화하는 것은 무엇입니까? 중첩 함수 없이는 할 수없는 일을 yau가하고 싶습니까? 등등.
중첩 함수 내에서 중첩 함수 및 함수를 구현하는 방법은 다음과 같습니다.
package main
import "fmt"
func main() {
nested := func() {
fmt.Println("I am nested")
deeplyNested := func() {
fmt.Println("I am deeply nested")
}
deeplyNested()
}
nested()
}
Go에서 중첩 된 함수가 허용됩니다. 외부 함수 내의 지역 변수에 할당하고 해당 변수를 사용하여 호출하기 만하면됩니다.
예:
func outerFunction(iterations int, s1, s2 string) int {
someState := 0
innerFunction := func(param string) int {
// Could have another nested function here!
totalLength := 0
// Note that the iterations parameter is available
// in the inner function (closure)
for i := 0; i < iterations; i++) {
totalLength += len(param)
}
return totalLength
}
// Now we can call innerFunction() freely
someState = innerFunction(s1)
someState += innerFunction(s2)
return someState
}
myVar := outerFunction(100, "blah", "meh")
내부 함수는 종종 로컬 고 루틴에 유용합니다.
func outerFunction(...) {
innerFunction := func(...) {
...
}
go innerFunction(...)
}
()
끝에 추가 하여 즉시 호출하면됩니다 .
func main() {
func inc(x int) int { return x+1; }()
}
편집 : 함수 이름을 가질 수 없으므로 즉시 호출되는 람다 함수입니다.
func main() {
func(x int) int { return x+1; }()
}
'code' 카테고리의 다른 글
datetime 또는 timestamp를 사용하는 경우 (0) | 2020.11.05 |
---|---|
트위터 부트 스트랩-테두리 (0) | 2020.11.05 |
objdump를 사용하여 하나의 단일 함수를 분해하는 방법은 무엇입니까? (0) | 2020.11.05 |
C ++ 14의 Lambda-Over-Lambda (0) | 2020.11.05 |
목록에서 두 번째 요소를 어떻게 얻을 수 있습니까? (0) | 2020.11.05 |