Go の関数内のネストされたクラス
Go では、カプセル化の目的で関数内に構造体のネストを許可します。しかし、疑問が生じます: 関数内でネストされたクラスを定義するメカニズムはありますか?
Go では、ラムダを除き、ネストされた関数は許可されません。この制限により、関数内のクラス機能に関する懸念が生じます。
この問題をさらに詳しく説明するために、次のコード例で制限を示します。
<code class="go">func f() { // Nested struct Cls inside f type Cls struct { // ... } // Attempt to bind foo to Cls (fails) func (c *Cls) foo() { // ... } }</code>
このコードは、関数内にネストされたクラス Cls を作成しようとします。 f ですが、メソッド foo を Cls にバインドする試みは失敗します。関数内ではクラスが弱くなっているようです。
この制限に対処するために、Go は関数リテラルの概念を提供します。関数リテラルを使用すると、関数を宣言して変数に割り当てることができます。このアプローチを使用すると、ネストされた関数に似たものを作成できます。
<code class="go">func f() { foo := func(s string) { fmt.Println(s) } foo("Hello World!") }</code>
この例では、関数リテラル foo が作成され、関数 f 内の変数に割り当てられます。 f を呼び出すと、「Hello World!」が出力されます。
関数リテラルは関数の入れ子に対する回避策を提供しますが、これらは真の入れ子関数ではなく、他の言語の入れ子クラスと比較して特定の制限があることに注意することが重要です。
以上がネストされたクラス機能は Go の関数内で使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。