함수 호출을 위한 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!