Go で関数呼び出しを引数として渡すことはできますか?

Linda Hamilton
リリース: 2024-10-29 15:43:02
オリジナル
1076 人が閲覧しました

Can you Pass Function Calls as Arguments in Go?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート