Go가 함수 호출을 매개변수로 사용하기 위한 유형으로 직접 나타낼 수 있나요?

Mary-Kate Olsen
풀어 주다: 2024-10-29 03:29:02
원래의
801명이 탐색했습니다.

Can Go directly represent function calls as a type for use as parameters?

함수 호출을 위한 Go 입력

go, defer 등의 키워드를 활용하는 경우 함수 호출이 매개변수로 필요합니다. 그러나 특히 함수 호출(단순히 함수 자체가 아님)을 인수로 예상하는 함수를 생성하는 데 유사한 방식으로 사용할 수 있는 특정 유형이 있습니까?

제한 사항 및 해결 방법

Go에서는 이 기능을 직접적으로 허용하는 유형을 제공하지 않습니다. 대신, 함수 유형의 변수나 값을 사용하고 나중에 함수인 것처럼 호출할 수 있습니다. 예를 들면 다음과 같습니다.

<code class="go">func myFunc() {
    fmt.Println("hi")
}

func main() {
    var f func()
    f = myFunc
    f() // This calls the function value stored in f: myFunc in this example
}</code>
로그인 후 복사

주석에 언급된 원하는 기능을 얻으려면 func() 내에 함수 호출과 인수를 래핑하고 이를 활용하세요. 예:

<code class="go">func launch(f func()) {
    fmt.Println("Before launch")
    go func() {
        defer fmt.Println("After completion")
        f()
    }()
}</code>
로그인 후 복사

사용법:

<code class="go">func main() {
    launch(func() {
        fmt.Println("Hello, playground")
    })

    time.Sleep(time.Second)
}</code>
로그인 후 복사

출력:

Before launch
Hello, playground
After completion
로그인 후 복사

이 방법에는 직접적인 해결 방법이 포함되지 않습니다. 매개변수가 변경되면 launch()를 호출하기 전에 복사본을 만들고 함수 리터럴(클로저) 내에서 복사본을 사용합니다.

자동 매개변수 저장 모방

특정 함수의 경우 유형을 지정하고 동일한 시그니처를 사용하여 도우미 함수를 만들고 매개 변수 없이 함수를 반환합니다. 반환된 함수는 클로저 역할을 하며 매개변수를 사용하여 원래 함수를 호출합니다. 도우미 함수를 호출하면 defer의 동작을 모방하여 매개변수를 효과적으로 저장합니다:

<code class="go">func wrapPrintln(s string) func() {
    return func() {
        fmt.Println(s)
    }
}</code>
로그인 후 복사

사용법:

<code class="go">launch(wrapPrintln(s))</code>
로그인 후 복사

Reflection 사용

Reflection 수동 복사의 필요성을 없앨 수 있지만 이 접근 방식에는 함수를 호출하는 대신 매개 변수로 전달하는 방법이 포함됩니다. 또한 반사 오버헤드로 인해 속도가 느려집니다.

<code class="go">func launch(f interface{}, params ...interface{}) {
    fmt.Println("Before launch")
    go func() {
        defer fmt.Println("After completion")
        pv := make([]reflect.Value, len(params))
        for i, v := range params {
            pv[i] = reflect.ValueOf(v)
        }
        reflect.ValueOf(f).Call(pv)
    }()
}</code>
로그인 후 복사

사용 예:

<code class="go">func main() {
    i, s := 1, "Hello, playground"

    launch(fmt.Printf, "%d %q\n", i, s)
    i, s = 2, "changed"

    time.Sleep(time.Second)
}</code>
로그인 후 복사

출력:

Before launch
1 "Hello, playground"
After completion
로그인 후 복사

예외: 메서드 값

자동 매개변수 저장을 활용할 수 있는 한 가지 예외는 메소드 값입니다. x에 정적 유형 T가 있고 T의 메서드 세트에 메서드 M이 포함된 경우 x.M(호출 없음)은 식의 결과(함수 값)가 호출될 때 x의 복사본을 수신자로 캡처하는 메서드 값을 나타냅니다.

위 내용은 Go가 함수 호출을 매개변수로 사용하기 위한 유형으로 직접 나타낼 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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