go や defer などの Go キーワードは、パラメーターとして関数呼び出しを期待します。同じ目的を果たし、関数が関数の代わりに関数呼び出しを引数として受け取ることを可能にする専用の型はありますか?
残念ながら、そのような型はありません行く。 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: myFunc in this example }</code>
場合によっては、関数呼び出しのパラメータを自動保存することが望ましい場合があります。特定の関数タイプについては、パラメータのない関数を返す同一のシグネチャを持つヘルパー関数を導入することでこれを実現できます。これらのクロージャは、保存されたパラメータを使用して元の関数を呼び出します。
リフレクションを使用すると、パラメータの手動コピーを回避できます。ただし、関数を呼び出すのではなく渡す必要があるため、プロセスが遅くなります。
メソッドを使用する場合には例外があります。メソッド値はレシーバーのコピーを保存し、メソッド呼び出しのパラメーターを自動的に保存できるようにします。
<code class="go">type myParams struct { format string i int s string } func (mp myParams) Call() { fmt.Printf(mp.format, mp.i, mp.s) } func main() { p := myParams{format: "%d %q\n", i: 1, s: "Hello, playground"} launch(p.Call) // p is saved here p.i, p.s = 2, "changed" time.Sleep(time.Second) }</code>
注: これらのアプローチはどれも、目的の機能に完全に一致するものではありません。パラメーターが変更される可能性がある場合は、パラメーターを保存するヘルパーに関数を渡す前に、手動でコピーする必要があります。
以上がGo で関数呼び出しの型を定義できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。