Go で関数呼び出しのような動作を実現する
Go では、go や defer などのキーワードは関数がパラメータとして渡されることを期待します。ただし、実際の関数呼び出しを渡すことを妨げる制限があります。
答え:
残念ながら、関数呼び出しを引数として模倣できる直接型はありません。 go と defer は言語仕様に基づいた構文構造であり、コンパイラはこの動作を強制します。
代替アプローチ: 関数値を使用する
この制限を回避するには、次のようにします。関数値を使用します。関数値は、関数型の変数または値です。関数の値は後で、または必要なときにいつでも呼び出すことができます。
<code class="go">func myFunc() { fmt.Println("hi") } func main() { var f func() f = myFunc f() // This calls the function value stored in f, which is myFunc in this case }</code>
パラメータの自動保存のエミュレーション
コメントで、パラメータの自動保存の要望について言及しました。 。保存されたパラメータを持つラップされた関数を提供するヘルパー関数を使用してこれを実現する方法は次のとおりです。
<code class="go">func wrapPrintln(s string) func() { return func() { fmt.Println(s) } } func launch(f func()) { fmt.Println("Before launch") go func() { defer fmt.Println("After completion") f() }() } func main() { s := "Hello, playground" launch(wrapPrintln(s)) }</code>
オプションとしてのリフレクション
リフレクションは、別の処理方法です。このシナリオでは、関数をインターフェイスとして渡し、リフレクションを使用してそれを呼び出す必要があります。このアプローチは、関数値を使用するよりも効率的ではありませんが、さまざまなシグネチャを持つ関数を処理できます。
結論として、関数呼び出しを引数として渡す直接的な方法はありませんが、関数値を使用するか、ヘルパーを介してパラメーターの保存を模倣します。関数は、同様の動作を実現するための回避策を提供します。
以上がGo で関数呼び出しを引数として渡すことはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。