ホームページ  >  記事  >  バックエンド開発  >  Go で関数呼び出しの型を定義できますか?

Go で関数呼び出しの型を定義できますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-01 11:49:02526ブラウズ

Can You Define a Type for Function Calls in Go?

Go で関数呼び出しの型を定義することは可能ですか?

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。