Go の関数内のネストされたクラス: 可能性と制限
Go では、関数内のネストされた構造体は許容されますが、ネストされた構造体を作成する機能はありません関数 (ラムダ関数以外) は制限されています。ここで疑問が生じます: 関数内でネストされたクラスを定義することは本当に不可能なのでしょうか?
説明のために、次のコード スニペットを考えてみましょう:
<code class="go">func f() { // Nested struct Cls within f type Cls struct { //... } // Attempt to bind foo to Cls (fails) func (c *Cls) foo() { //... } }</code>
この例では、ネストされた構造体 Cls のメンバーとして関数 foo を定義すると失敗します。ネストされた構造体によって提供される柔軟性を考えると、この制限は異例に思えるかもしれません。
ただし、関数にレシーバーがあるかどうかに関係なく、Go で関数をネストすることは本質的に許可されていないことを認識することが重要です。
この制限を回避するために、Go は、以下に示すように、他の関数内で関数を宣言できる関数リテラルを提供します。
<code class="go">func f() { foo := func(s string) { fmt.Println(s) } foo("Hello World!") }</code>
この例では、外部関数 f 内で、関数変数 foo を作成します。 。この変数には、引数「Hello World!」を指定して呼び出すことができる関数が格納されます。外部関数 f が呼び出されるとき、「Hello World!」
このアプローチでは、関数リテラルを利用することで、特定の制約内ではありますが、関数内でネストされたクラスのエミュレーションが可能になります。
以上がGo の関数内にネストされたクラスは存在できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。