[function] Go에서 중첩 된 함수 선언 (함수 내부 함수)을 허용하지 않는 이유는 무엇입니까?

편집 : 내가 묻는 것이 명확하지 않은 경우 : 중첩 된 함수 선언을 허용하지 않음으로써 완화되는 문제는 무엇입니까?

Lambda는 예상대로 작동합니다.

func main() {
    inc := func(x int) int { return x+1; }
}

그러나 선언 내부의 다음 선언은 허용되지 않습니다.

func main() {
    func inc(x int) int { return x+1; }
}

중첩 함수가 허용되지 않는 이유는 무엇입니까?



답변

이 명백한 기능이 허용되지 않는 3 가지 이유가 있다고 생각합니다.

  1. 컴파일러를 약간 복잡하게 만들 것입니다. 현재 컴파일러는 모든 함수가 최상위 수준에 있음을 알고 있습니다.
  2. 새로운 종류의 프로그래머 오류가 발생합니다. 무언가를 리팩터링하고 실수로 일부 함수를 중첩 할 수 있습니다.
  3. 함수와 클로저에 대해 다른 구문을 갖는 것은 좋은 일입니다. 클로저를 만드는 것은 함수를 만드는 것보다 잠재적으로 더 비싸므로 당신이 그것을하고 있다는 것을 알아야합니다.

그건 내 의견 일뿐입니다. 언어 디자이너의 공식적인 발표를 보지 못했습니다.


답변

물론입니다. 변수에 할당하기 만하면됩니다.

func main() {
    inc := func(x int) int { return x+1; }
}


답변

자주 묻는 질문 (FAQ)

Go에 기능 X가없는 이유는 무엇입니까?

모든 언어에는 새로운 기능이 포함되어 있으며 누군가가 좋아하는 기능은 생략되어 있습니다. 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; }()
}


답변